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.“
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.
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.
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); }); } }
Um a zu binden DataGrid asynchron und aktualisieren Sie es bei Bedarf:
// 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!