錯誤:「這種類型的CollectionView 不支援從與Dispatcher 執行緒不同的執行緒變更其SourceCollection」
問題:
在UI 執行緒以外的執行緒上修改ObservableCollection 時發生錯誤。
解決方案:
1.使用Dispatcher.Invoke:
要從不同執行緒更新ObservableCpatection,請用Dis .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}"/>
綁定:
public void RefreshDataGridAsync() { Task.Run(() => { Dispatcher.InvokeAsync(() => { dataGridParent.ItemsSource = null; dataGridParent.ItemsSource = MatchObsCollection; }); }); }要非同步刷新DataGrid,請呼叫Refresh委託中調度程序的方法。
以上是如何解決「這種類型的 CollectionView 不支援從與 Dispatcher 執行緒不同的執行緒更改其 SourceCollection」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!