Rumah > pembangunan bahagian belakang > C++ > Adakah ObservableCollection Wujud Yang Menjejaki Kedua-dua Koleksi dan Perubahan Harta Elemen?

Adakah ObservableCollection Wujud Yang Menjejaki Kedua-dua Koleksi dan Perubahan Harta Elemen?

Susan Sarandon
Lepaskan: 2025-01-07 16:36:40
asal
859 orang telah melayarinya

Does an ObservableCollection Exist That Tracks Both Collection and Element Property Changes?

ObservableCollection yang memantau perubahan koleksi dan atribut elemen

Soalan:

Adakah terdapat koleksi yang secara serentak boleh memantau perubahan dalam koleksi itu sendiri dan perubahan dalam atribut elemennya?

Penyelesaian:

Jika tiada koleksi siap sedia memenuhi keperluan ini, anda boleh membuat pelaksanaan yang memanjangkan ObservableCollection untuk memantau elemennya bagi acara PropertyChanged.

Pelaksanaan:

Berikut ialah contoh pelaksanaan ObservableCollectionEx yang melaksanakan fungsi ini:

public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged
{
    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        Unsubscribe(e.OldItems);
        Subscribe(e.NewItems);
        base.OnCollectionChanged(e);
    }

    protected override void ClearItems()
    {
        foreach (T element in this)
            element.PropertyChanged -= ContainedElementChanged;

        base.ClearItems();
    }

    private void Subscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged += ContainedElementChanged;
        }
    }

    private void Unsubscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged -= ContainedElementChanged;
        }
    }

    private void ContainedElementChanged(object sender, PropertyChangedEventArgs e)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(e.PropertyName)); //Corrected this line.
    }
}
Salin selepas log masuk

Penggunaan:

Gunakan ObservableCollection seperti ObservableCollectionEx biasa, tetapi tukarkannya kepada INotifyPropertyChanged untuk melanggan peristiwa perubahan sifat elemennya:

ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>();
((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();
Salin selepas log masuk

Nota: Dalam kaedah ContainedElementChanged, parameter OnPropertyChanged perlu menjadi contoh PropertyChangedEventArgs baharu dan bukannya menggunakan e secara langsung. Ini telah diperbetulkan dalam kod di atas. Ini memastikan bahawa nama sifat yang betul dihantar kepada pengendali acara.

Atas ialah kandungan terperinci Adakah ObservableCollection Wujud Yang Menjejaki Kedua-dua Koleksi dan Perubahan Harta Elemen?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan