「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > WPF の非ディスパッチャー スレッドから ObservableCollection を変更する方法

WPF の非ディスパッチャー スレッドから ObservableCollection を変更する方法

2024 年 11 月 8 日に公開
ブラウズ:265

How to Modify an ObservableCollection From a Non-Dispatcher Thread in WPF?

「この種類の CollectionView は、ディスパッチャ スレッドとは異なるスレッドからの SourceCollection への変更をサポートしていません」

問題の説明

DataGrid がバインドされています非同期的に設定された ObservableCollection に対して、非 Dispatcher スレッドからの SourceCollection への変更が許可されていないことを示すエラーがスローされます。

解決策

この問題は、スレッドのアフィニティによって発生します。 ObservableCollection は最初に UI スレッド上に作成されるため、UI スレッドからのみアクセス可能になります。別のスレッドから変更するには、デリゲートを UI ディスパッチャーに配置する必要があります。

更新された ViewModel コード

public void Load()
{
    matchList = new List();
    matchList = proxy.GetMatch().ToList();

    foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList)
    {
        App.Current.Dispatcher.Invoke((Action)delegate
        {
            _matchObsCollection.Add(match);
        });
    }
}

UI ディスパッチャーでデリゲートを呼び出すことにより、ObservableCollection への追加が UI スレッドでスケジュールされ、例外が解決されます。

強化されたバインディングとリフレッシュ

非同期の場合DataGrid のバインドと更新を行う場合は、ViewModel プロパティで INotifyPropertyChanged を使用し、Dispatcher を呼び出して UI 要素を更新することを検討してください。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3