ホームページ  >  記事  >  バックエンド開発  >  WPF でバックグラウンド スレッドから ObservableCollection を安全に変更する方法

WPF でバックグラウンド スレッドから ObservableCollection を安全に変更する方法

Susan Sarandon
Susan Sarandonオリジナル
2024-10-30 07:28:27614ブラウズ

How to Safely Modify ObservableCollections from Background Threads in WPF?

UI スレッド アフィニティと ObservableCollection の変更

問題の概要

UI スレッド以外のスレッドから DataGrid にバインドされた ObservableCollection を更新するとき、 「このタイプの CollectionView は、Dispatcher スレッドとは異なるスレッドからの SourceCollection への変更をサポートしていません。」

UI スレッド アフィニティについて

ObservableCollection は UI スレッド上に作成されます。その結果、それらはそのスレッドに対してアフィニティを持ちます。つまり、変更は同じスレッドからのみ行うことができます。別のスレッド (バックグラウンド スレッドなど) からこれらを変更しようとすると、例外がトリガーされます。

解決策: UI ディスパッチャーを呼び出す

問題を解決するには、ObservableCollection を更新するときに UI ディスパッチャーを呼び出します。別のスレッド。これにより、操作が 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() を使用します。

// Bind DataGrid to ObservableCollection
DataGrid.SetBinding(ItemsSourceProperty, new Binding("MatchObsCollection"));

// Subscribe to CollectionChanged event
MatchObsCollection.CollectionChanged += (s, e) =>
{
    DataGrid.Items.Refresh();
};

これらのガイドラインに従うことで、変更が確実に行われるようにしながら、ObservableCollection を安全に更新し、DataGrid を非同期的にバインドできます。正しいスレッドです。

以上がWPF でバックグラウンド スレッドから ObservableCollection を安全に変更する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。