Rumah >pembangunan bahagian belakang >C++ >Adakah Koleksi Wujud Yang Memantau Perubahan dalam Kedua-dua Sendiri dan Elemennya?
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!