错误:“这种类型的 CollectionView 不支持从与 Dispatcher 线程不同的线程更改其 SourceCollection”
问题:
在 UI 线程以外的线程上修改 ObservableCollection 时出现错误。
解决方案:
1.使用 Dispatcher.Invoke:
要从不同线程更新 ObservableCollection,请使用 Dispatcher.Invoke 调用 UI 线程上的更改。
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.使用 async/await:
或者,您可以使用 async/await 在 UI 线程上异步执行 Load 方法。
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 绑定和刷新:
绑定:
<DataGrid ItemsSource="{Binding MatchObsCollection}"/>
异步刷新:
要异步刷新 DataGrid,请调用 Refresh委托中调度程序的方法。
public void RefreshDataGridAsync() { Task.Run(() => { Dispatcher.InvokeAsync(() => { dataGridParent.ItemsSource = null; dataGridParent.ItemsSource = MatchObsCollection; }); }); }
以上是如何解决“这种类型的 CollectionView 不支持从与 Dispatcher 线程不同的线程更改其 SourceCollection”?的详细内容。更多信息请关注PHP中文网其他相关文章!