Ralat: "Jenis CollectionView ini tidak menyokong perubahan pada SourceCollection daripada thread yang berbeza daripada Dispatcher thread"
Masalah:
Ralat berlaku apabila mengubah suai ObservableCollection pada urutan selain daripada urutan UI.
Penyelesaian:
1. Menggunakan Dispatcher.Invoke:
Untuk mengemas kini ObservableCollection daripada urutan lain, gunakan perubahan pada urutan UI menggunakan Dispatcher.Invoke.
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. Menggunakan async/wait:
Sebagai alternatif, anda boleh menggunakan async/waiit untuk melaksanakan kaedah Muatkan secara tidak segerak pada urutan UI.
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 Binding and Refreshing:
Mengikat:
<DataGrid ItemsSource="{Binding MatchObsCollection}"/>
Menyegarkan Secara Asynchronous:
Untuk memuat semula DataGrid secara tidak segerak, panggil Muat Semula kaedah pada penghantar dalam perwakilan.
public void RefreshDataGridAsync() { Task.Run(() => { Dispatcher.InvokeAsync(() => { dataGridParent.ItemsSource = null; dataGridParent.ItemsSource = MatchObsCollection; }); }); }
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan \'Jenis CollectionView ini tidak menyokong perubahan pada SourceCollection daripada thread yang berbeza daripada thread Dispatcher\'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!