首頁 >後端開發 >C++ >如何在 WPF 中從後台執行緒安全地修改 ObservableCollections?

如何在 WPF 中從後台執行緒安全地修改 ObservableCollections?

Susan Sarandon
Susan Sarandon原創
2024-10-30 07:28:27697瀏覽

How to Safely Modify ObservableCollections from Background Threads in WPF?

UI 執行緒親和性與ObservableCollection 修改

問題概述

從UI 執行緒以外的執行緒更新綁定到DataGrid 的執行緒會發生例外:「這種類型的CollectionView 不支援從與Dispatcher 執行緒不同的執行緒更改其SourceCollection。」

了解UI 執行緒關聯性

ObservableCollections 在UI 執行緒上建立。因此,它們與該線程具有親和力,這意味著只能從同一線程進行更改。嘗試從另一個執行緒(例如後台執行緒)修改它們將觸發異常。

解決方案:呼叫 UI Dispatcher

要解決此問題,請在更新 ObservableCollection 時呼叫 UI Dispatcher不同的執行緒。這會將操作委託給 UI 線程,以便安全地執行。

更新了ViewModel 程式碼

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 刷新

綁定DataGrid 非同步並在必要時刷新它:

  1. 實作非同步載入: 使用非同步方法(如AsyncDelegateCommand)將資料載入到ObservableCollection 中。
  2. 訂閱 CollectionChanged 事件: 訂閱 ObservableCollection 的 CollectionChanged 事件以取得變更通知並相應更新 DataGrid。
  3. 觸發 DataGrid 刷新: 使用 Items.Refresh() 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn