从 UI 线程以外的线程更新绑定到 DataGrid 的 ObservableCollection 时,可能会发生异常:“这种类型的 CollectionView 不支持从与 Dispatcher 线程不同的线程更改其 SourceCollection。”
ObservableCollections 在 UI 线程上创建。因此,它们与该线程具有亲和力,这意味着只能从同一线程进行更改。尝试从另一个线程(例如后台线程)修改它们将触发异常。
要解决此问题,请在更新 ObservableCollection 时调用 UI Dispatcher不同的线程。这会将操作委托给 UI 线程,以便安全执行。
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); }); } }
绑定DataGrid 异步并在必要时刷新它:
// Bind DataGrid to ObservableCollection DataGrid.SetBinding(ItemsSourceProperty, new Binding("MatchObsCollection")); // Subscribe to CollectionChanged event MatchObsCollection.CollectionChanged += (s, e) => { DataGrid.Items.Refresh(); };
通过遵循这些准则,您可以安全地异步更新 ObservableCollections 并绑定 DataGrid,同时确保在正确的线程。
以上是如何在 WPF 中从后台线程安全地修改 ObservableCollections?的详细内容。更多信息请关注PHP中文网其他相关文章!