Apabila mengemas kini ObservableCollection yang terikat pada DataGrid daripada urutan selain daripada utas UI, pengecualian boleh berlaku: "Jenis CollectionView ini tidak menyokong perubahan pada SourceCollectionnya daripada thread yang berbeza daripada thread Dispatcher."
ObservableCollections dibuat pada utas UI. Akibatnya, mereka mempunyai pertalian untuk utas itu, bermakna perubahan hanya boleh dibuat daripada utas yang sama. Percubaan untuk mengubah suainya daripada urutan lain (cth., utas latar belakang) akan mencetuskan pengecualian.
Untuk menyelesaikan isu ini, gunakan UI Dispatcher apabila mengemas kini ObservableCollection daripada benang yang berbeza. Ini akan mewakilkan operasi kepada urutan UI, di mana ia boleh dilaksanakan dengan selamat.
public void Load() { matchList = new List<GetMatchDetailsDC>(); matchList = proxy.GetMatch().ToList(); foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList) { // This syntax invokes the UI dispatcher // and modifies the ObservableCollection on the UI thread App.Current.Dispatcher.Invoke((Action)delegate { _matchObsCollection.Add(match); }); } }
Untuk mengikat a DataGrid secara tak segerak dan muat semula apabila perlu:
// Bind DataGrid to ObservableCollection DataGrid.SetBinding(ItemsSourceProperty, new Binding("MatchObsCollection")); // Subscribe to CollectionChanged event MatchObsCollection.CollectionChanged += (s, e) => { DataGrid.Items.Refresh(); };
Dengan mengikut garis panduan ini, anda boleh mengemas kini ObservableCollections dengan selamat dan mengikat DataGrids secara tidak segerak sambil memastikan perubahan dibuat pada benang yang betul.
Atas ialah kandungan terperinci Bagaimana untuk Mengubah suai ObservableCollections dengan selamat daripada Thread Latar Belakang dalam WPF?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!