Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Memaklumkan dengan Cekap Koleksi Boleh Diperhatikan Perubahan Harta Item?

Bagaimana untuk Memaklumkan dengan Cekap Koleksi Boleh Diperhatikan Perubahan Harta Item?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-05 19:33:41177semak imbas

How to Efficiently Notify an ObservableCollection of Item Property Changes?

Cara Memberitahu ObservableCollection Apabila Item Berubah

Kelas ObservableCollection dalam .NET menyediakan cara untuk menjejaki perubahan pada koleksi, seperti menambah atau mengeluarkan barang. Walau bagaimanapun, ia tidak mengesan perubahan secara automatik pada sifat item dalam koleksi.

Untuk menangani isu ini, pelaksanaan tersuai wujud, seperti TrulyObservableCollection yang disebut dalam soalan. Kelas ini memanjangkan ObservableCollection dan menambah pengendali acara untuk item yang ditambahkan dan dialih keluar daripada koleksi. Ia juga menjejaki perubahan sifat pada item individu.

Pelaksanaan dan Penggunaan

Untuk menggunakan TrulyObservableCollection, anda perlu membuat contoh dan mengisinya dengan item:

public class MyViewModel
{
    public TrulyObservableCollection<MyType> MyItemsSource { get; set; }

    public MyViewModel()
    {
        MyItemsSource = new TrulyObservableCollection<MyType>();
        MyItemsSource.Add(new MyType() { MyProperty = false });
        MyItemsSource.Add(new MyType() { MyProperty = true });
        MyItemsSource.Add(new MyType() { MyProperty = false });
    }
}

Walau bagaimanapun, pelaksanaan TrulyObservableCollection menimbulkan acara Reset untuk keseluruhan koleksi apabila perubahan harta benda. Ini boleh mempunyai implikasi prestasi dan mungkin bukan tingkah laku yang diingini.

Pendekatan Alternatif

Pendekatan alternatif ialah mendaftarkan pengendali acara penukaran harta benda untuk setiap item dalam koleksi secara terus :

public class MyViewModel
{
    public ObservableCollection<MyType> MyItemsSource { get; set; }

    public MyViewModel()
    {
        MyItemsSource = new ObservableCollection<MyType>();
        MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;

        MyItemsSource.Add(new MyType() { MyProperty = false });
        MyItemsSource.Add(new MyType() { MyProperty = true });
        MyItemsSource.Add(new MyType() { MyProperty = false });
    }

    private void MyItemsSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
            foreach (MyType item in e.NewItems)
                item.PropertyChanged += MyType_PropertyChanged;

        if (e.OldItems != null)
            foreach (MyType item in e.OldItems)
                item.PropertyChanged -= MyType_PropertyChanged;
    }

    private void MyType_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "MyProperty")
            DoWork(); // Perform desired action
    }
}

Dengan mendaftarkan pengendali acara perubahan harta benda hanya untuk item apabila ia ditambah atau dialih keluar daripada koleksi, pendekatan ini menyasarkan item harta berubah dengan lebih berkesan sambil mengelakkan overhed prestasi.

Atas ialah kandungan terperinci Bagaimana untuk Memaklumkan dengan Cekap Koleksi Boleh Diperhatikan Perubahan Harta Item?. 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