Mesej ralat yang diberikan, "Jenis ini of CollectionView tidak menyokong perubahan pada SourceCollection daripada thread yang berbeza daripada Dispatcher thread," menunjukkan percubaan untuk mengubah suai ObservableCollection daripada thread bukan UI.
Seperti yang dijelaskan dalam kod yang disediakan, ViewModel's Load( ) kaedah mengisi _matchObsCollection ObservableCollection daripada senarai objek GetMatchDetailsDC. Walau bagaimanapun, kemas kini ini dilakukan di luar urutan UI.
Dalam WPF, elemen UI, seperti DataGrid, dicipta pada utas UI dan mengekalkan pertalian benang. Sebarang pengubahsuaian kepada elemen ini mesti dilakukan daripada urutan UI untuk memastikan keselamatan rangkaian.
Untuk menyelesaikan isu ini, anda boleh menggunakan App.Current.Dispatcher.Invoke(( Tindakan)delegasikan kaedah { ... }) untuk menggunakan kemas kini koleksi pada urutan 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>
Walaupun menggunakan kaedah tak segerak untuk pemuatan data adalah perkara biasa, adalah penting untuk mempertimbangkan keselamatan utas apabila memanipulasi elemen UI daripada utas bukan UI. Sentiasa pastikan bahawa sebarang kemas kini kepada elemen UI, seperti mengubah suai ObservableCollection, dilakukan pada urutan UI untuk mengelakkan ralat berkaitan urutan.
Atas ialah kandungan terperinci Mengapa Saya Mendapat \'Jenis CollectionView ini tidak menyokong perubahan pada SourceCollection daripada utas yang berbeza daripada utas Dispatcher\'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!