Fehler: „Diese Art von CollectionView unterstützt keine Änderungen an seiner SourceCollection von einem anderen Thread als dem Dispatcher-Thread“
Problem:
Der Fehler tritt auf, wenn eine ObservableCollection in einem anderen Thread als dem UI-Thread geändert wird.
Lösung:
1. Verwenden von Dispatcher.Invoke:
Um die ObservableCollection aus einem anderen Thread zu aktualisieren, rufen Sie die Änderungen im UI-Thread mit Dispatcher.Invoke auf.
public void Load() { matchList = new List<GetMatchDetailsDC>(); matchList = proxy.GetMatch().ToList(); foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList) { App.Current.Dispatcher.Invoke((Action)delegate { _matchObsCollection.Add(match); }); } }
2. Verwenden von async/await:
Alternativ können Sie async/await verwenden, um die Load-Methode asynchron im UI-Thread auszuführen.
public void LoadAsync() { Task.Run(async () => { matchList = new List<GetMatchDetailsDC>(); matchList = await proxy.GetMatchAsync(); await Dispatcher.InvokeAsync(() => { foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList) { _matchObsCollection.Add(match); } }); }); }
DataGrid-Bindung und -Aktualisierung:
Bindung:
<DataGrid ItemsSource="{Binding MatchObsCollection}"/>
Asynchrones Aktualisieren:
Um das DataGrid asynchron zu aktualisieren, rufen Sie „Refresh“ auf Methode für den Dispatcher in einem Delegaten.
public void RefreshDataGridAsync() { Task.Run(() => { Dispatcher.InvokeAsync(() => { dataGridParent.ItemsSource = null; dataGridParent.ItemsSource = MatchObsCollection; }); }); }
Das obige ist der detaillierte Inhalt vonWie kann das Problem behoben werden: „Dieser CollectionView-Typ unterstützt keine Änderungen an seiner SourceCollection von einem anderen Thread als dem Dispatcher-Thread'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!