エラー: 「このタイプの CollectionView は、ディスパッチャー スレッドとは異なるスレッドからの SourceCollection への変更をサポートしていません。」
問題:
UI スレッド以外のスレッドで ObservableCollection を変更するとエラーが発生します。
解決策:
1. Dispatcher.Invoke の使用:
別のスレッドから ObservableCollection を更新するには、Dispatcher.Invoke を使用して UI スレッドで変更を呼び出します。
public void Load() { matchList = new List<GetMatchDetailsDC>(); matchList = proxy.GetMatch().ToList(); foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList) { App.Current.Dispatcher.Invoke((Action)delegate { _matchObsCollection.Add(match); }); } }
2. async/await の使用:
または、async/await を使用して、UI スレッドで Load メソッドを非同期に実行できます。
public void LoadAsync() { Task.Run(async () => { matchList = new List<GetMatchDetailsDC>(); matchList = await proxy.GetMatchAsync(); await Dispatcher.InvokeAsync(() => { foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList) { _matchObsCollection.Add(match); } }); }); }
DataGrid バインディングとリフレッシュ:
バインディング:
<DataGrid ItemsSource="{Binding MatchObsCollection}"/>
非同期更新:
DataGrid を非同期的に更新するには、Refresh メソッドを呼び出します。デリゲート内のディスパッチャーのメソッド。
public void RefreshDataGridAsync() { Task.Run(() => { Dispatcher.InvokeAsync(() => { dataGridParent.ItemsSource = null; dataGridParent.ItemsSource = MatchObsCollection; }); }); }
以上が「この種類の CollectionView は、ディスパッチャー スレッドとは異なるスレッドからの SourceCollection への変更をサポートしていません」を解決する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。