Heim  >  Artikel  >  Backend-Entwicklung  >  Wie ändere ich ObservableCollections sicher aus Hintergrundthreads in WPF?

Wie ändere ich ObservableCollections sicher aus Hintergrundthreads in WPF?

Susan Sarandon
Susan SarandonOriginal
2024-10-30 07:28:27615Durchsuche

How to Safely Modify ObservableCollections from Background Threads in WPF?

UI-Thread-Affinität und ObservableCollection-Änderungen

Problemübersicht

Beim Aktualisieren einer an ein DataGrid gebundenen ObservableCollection aus einem anderen Thread als dem UI-Thread wird ein Es kann eine Ausnahme auftreten: „Diese Art von CollectionView unterstützt keine Änderungen an seiner SourceCollection von einem anderen Thread als dem Dispatcher-Thread.“

Grundlegendes zur UI-Thread-Affinität

ObservableCollections werden im UI-Thread erstellt. Dadurch haben sie eine Affinität zu diesem Thread, was bedeutet, dass Änderungen nur aus demselben Thread heraus vorgenommen werden können. Der Versuch, sie von einem anderen Thread (z. B. einem Hintergrundthread) aus zu ändern, löst die Ausnahme aus.

Lösung: UI-Dispatcher aufrufen

Um das Problem zu beheben, rufen Sie den UI-Dispatcher auf, wenn Sie die ObservableCollection aktualisieren ein anderer Thread. Dadurch wird der Vorgang an den UI-Thread delegiert, wo er sicher ausgeführt werden kann.

Aktualisierter ViewModel-Code

public void Load()
{
    matchList = new List<GetMatchDetailsDC>();
    matchList = proxy.GetMatch().ToList();

    foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList)
    {
        // This syntax invokes the UI dispatcher 
        // and modifies the ObservableCollection on the UI thread
        App.Current.Dispatcher.Invoke((Action)delegate
        {
            _matchObsCollection.Add(match);
        });
    }
}

Asynchrone Datenbindung und DataGrid-Aktualisierung

Um a zu binden DataGrid asynchron und aktualisieren Sie es bei Bedarf:

  1. Asynchrones Laden implementieren:Verwenden Sie asynchrone Methoden (wie AsyncDelegateCommand), um Daten in Ihre ObservableCollection zu laden.
  2. Abonnieren Sie das CollectionChanged-Ereignis: Abonnieren Sie das CollectionChanged-Ereignis der ObservableCollection, um über Änderungen benachrichtigt zu werden und das DataGrid entsprechend zu aktualisieren.
  3. DataGrid-Aktualisierung auslösen: Verwenden Sie Items.Refresh() Methode im DataGrid, um seine Daten manuell zu aktualisieren.

Beispiel

// Bind DataGrid to ObservableCollection
DataGrid.SetBinding(ItemsSourceProperty, new Binding("MatchObsCollection"));

// Subscribe to CollectionChanged event
MatchObsCollection.CollectionChanged += (s, e) =>
{
    DataGrid.Items.Refresh();
};

Durch Befolgen dieser Richtlinien können Sie ObservableCollections sicher aktualisieren und DataGrids asynchron binden und gleichzeitig sicherstellen, dass Änderungen vorgenommen werden der richtige Thread.

Das obige ist der detaillierte Inhalt vonWie ändere ich ObservableCollections sicher aus Hintergrundthreads in WPF?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn