Rumah >pembangunan bahagian belakang >C++ >Adakah Koleksi Wujud Yang Memantau Perubahan dalam Kedua-dua Sendiri dan Elemennya?

Adakah Koleksi Wujud Yang Memantau Perubahan dalam Kedua-dua Sendiri dan Elemennya?

DDD
DDDasal
2025-01-07 16:27:41932semak imbas

Does a Collection Exist That Monitors Changes in Both Itself and Its Elements?

Koleksi perubahan elemen pemantauan

Artikel ini meneroka konsep pemantauan koleksi itu sendiri dan perubahan kepada elemen koleksi. Biasanya, ObservableCollection memberitahu perubahan pada koleksi itu sendiri, tetapi bukan perubahan pada elemennya.

Adakah terdapat koleksi sedia ada yang boleh memantau perubahan elemen?

Ya, anda boleh membuat pelaksanaan tersuai melanjutkan ObservableCollection untuk memenuhi keperluan ini.

Custom ObservableCollection dengan keupayaan pemantauan elemen:

Ini ialah versi ObservableCollection yang diubah suai:

<code class="language-csharp">public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged
{
    // 订阅添加到项目中的 PropertyChanged 事件
    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        Subscribe(e.NewItems);
        base.OnCollectionChanged(e);
    }

    // 取消订阅从移除的项目中移除的 PropertyChanged 事件,并在清除集合时清除所有项目
    protected override void ClearItems()
    {
        foreach (T element in this)
            element.PropertyChanged -= ContainedElementChanged;
        base.ClearItems();
    }

    // 订阅元素中的 PropertyChanged 事件
    private void Subscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged += ContainedElementChanged;
        }
    }

    // 取消订阅元素中的 PropertyChanged 事件
    private void Unsubscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged -= ContainedElementChanged;
        }
    }

    // 当包含的元素属性更改时发出通知
    private void ContainedElementChanged(object sender, PropertyChangedEventArgs e)
    {
        OnPropertyChanged(e);
    }
}</code>

Gunakan koleksi tersuai ini:

<code class="language-csharp">ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>();
((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>

Nota apabila menggunakan acara PropertyChanged:

Perhatikan bahawa apabila menggunakan acara PropertyChanged pada koleksi tersuai, pengirim akan menjadi koleksi itu sendiri, bukan elemen yang berubah. Jika perlu, anda boleh menentukan acara ContainerElementChanged berasingan untuk pemberitahuan yang lebih jelas.

Atas ialah kandungan terperinci Adakah Koleksi Wujud Yang Memantau Perubahan dalam Kedua-dua Sendiri dan Elemennya?. 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