Pelanggaran Perkaitan Benang Penghantar dengan Pengubahsuaian ObservableCollection
Dalam aplikasi WPF, jenis koleksi tertentu, termasuk DataGrid, mesti diubah suai daripada Dispatcher benang. Ini kerana koleksi ini mengekalkan perkaitan dengan utas UI dan cuba mengubah suainya daripada utas lain boleh membawa kepada pengecualian seperti "Jenis CollectionView ini tidak menyokong perubahan pada SourceCollection daripada utas yang berbeza daripada utas Dispatcher."
Dalam kod yang disediakan, ObservableCollection _matchObsCollection dalam MainWindowViewModel dicipta pada urutan UI. Walau bagaimanapun, kaedah Load(), yang mengubah suai koleksi ini, dipanggil secara tak segerak. Ini menyebabkan pengecualian kerana pengubahsuaian dicuba daripada urutan selain daripada urutan UI.
Penyelesaian:
Untuk menyelesaikan isu, sebarang pengubahsuaian pada _matchObsCollection mesti dilakukan pada benang Dispatcher. Ini boleh dicapai dengan menggunakan kaedah Dispatcher.Invoke() untuk mewakilkan pengubahsuaian kepada urutan UI.
Berikut ialah versi diubah suai kaedah Load() yang menggunakan Dispatcher.Invoke() untuk mengubah suai ObservableCollection pada urutan 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); }); } }
Kod yang diubah suai ini memastikan bahawa semua pengubahsuaian pada _matchObsCollection diwakilkan kepada urutan UI, menyelesaikan pengecualian.
Atas ialah kandungan terperinci Bagaimanakah saya boleh mengubah suai ObservableCollection daripada Benang Berbeza dalam Aplikasi WPF Tanpa Pelanggaran Perkaitan Benang Penghantar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!