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
829 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:

<code class="language-csharp">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.
    }
}</code>
Salin selepas log masuk

Penggunaan:

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

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

sumber:php.cn
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