從UI 執行緒以外的執行緒更新綁定到DataGrid 的執行緒會發生例外:「這種類型的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中文網其他相關文章!