UI スレッド以外のスレッドから DataGrid にバインドされた ObservableCollection を更新するとき、 「このタイプの CollectionView は、Dispatcher スレッドとは異なるスレッドからの SourceCollection への変更をサポートしていません。」
ObservableCollection は UI スレッド上に作成されます。その結果、それらはそのスレッドに対してアフィニティを持ちます。つまり、変更は同じスレッドからのみ行うことができます。別のスレッド (バックグラウンド スレッドなど) からこれらを変更しようとすると、例外がトリガーされます。
問題を解決するには、ObservableCollection を更新するときに UI ディスパッチャーを呼び出します。別のスレッド。これにより、操作が 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(); };
これらのガイドラインに従うことで、変更が確実に行われるようにしながら、ObservableCollection を安全に更新し、DataGrid を非同期的にバインドできます。正しいスレッドです。
以上がWPF でバックグラウンド スレッドから ObservableCollection を安全に変更する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。