給定的錯誤訊息,「這種類型CollectionView 不支援從與Dispatcher 執行緒不同的執行緒變更其SourceCollection”,表示嘗試從非UI 執行緒修改ObservableCollection。
如提供的程式碼所述,ViewModel 的 Load( ) 方法從 GetMatchDetailsDC 物件清單填入 _matchObsCollection ObservableCollection。但是,此更新是在 UI 執行緒之外執行的。
在 WPF 中,UI 元素(例如 DataGrid)是在 UI 執行緒上建立的,並維護一個執行緒親和力。對這些元素的任何修改都必須從 UI 執行緒執行,以確保執行緒安全。
要解決此問題,您可以使用App.Current.Dispatcher.Invoke(( Action)delegate { ... }) 方法在UI 執行緒上呼叫集合更新:
<code class="csharp">matchList = proxy.GetMatch().ToList(); foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList) { App.Current.Dispatcher.Invoke((Action)delegate // <-- Here { _matchObsCollection.Add(match); }); }</code>
雖然使用非同步方法進行資料載入很常見,從非UI 執行緒操作UI 元素時,考慮執行緒安全非常重要。請務必確保對 UI 元素的任何更新(例如修改 ObservableCollection)都在 UI 執行緒上執行,以避免與執行緒相關的錯誤。
以上是為什麼我收到“這種類型的 CollectionView 不支援從與 Dispatcher 線程不同的線程更改其 SourceCollection”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!