Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengubah suai ObservableCollections dengan selamat daripada Thread Latar Belakang dalam WPF?

Bagaimana untuk Mengubah suai ObservableCollections dengan selamat daripada Thread Latar Belakang dalam WPF?

Susan Sarandon
Susan Sarandonasal
2024-10-30 07:28:27615semak imbas

How to Safely Modify ObservableCollections from Background Threads in WPF?

Perkaitan Benang UI dan Pengubahsuaian ObservableCollection

Gambaran Keseluruhan Masalah

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."

Memahami Perkaitan Benang UI

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.

Penyelesaian: Invoke UI Dispatcher

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.

Kod ViewModel yang Dikemas kini

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);
        });
    }
}

Async Data Binding dan DataGrid Refresh

Untuk mengikat a DataGrid secara tak segerak dan muat semula apabila perlu:

  1. Laksanakan Pemuatan Asynchronous: Gunakan kaedah tak segerak (seperti AsyncDelegateCommand) untuk memuatkan data ke dalam ObservableCollection anda.
  2. Langgan acara CollectionChanged dari ObservableCollection untuk dimaklumkan tentang perubahan dan kemas kini DataGrid sewajarnya.
  3. Cetuskan Penyegaran DataGrid: Gunakan Items.Refresh() kaedah pada DataGrid untuk memuat semula datanya secara manual.

Contoh

// 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn