本文探討了監控集合本身以及集合元素變化的概念。通常,ObservableCollection
會通知集合本身的變化,但不會通知其元素的變化。
是否存在現有能夠監控元素變化的集合?
是的,您可以建立一個自訂實作來擴充 ObservableCollection
以滿足此要求。
具有元素監控功能的自訂 ObservableCollection:
這是一個修改後的 ObservableCollection
版本:
<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>
使用此自訂集合:
<code class="language-csharp">ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>(); ((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>
使用 PropertyChanged 事件時的注意事項:
請注意,當在自訂集合上使用 PropertyChanged
事件時,發送者將是集合本身,而不是發生變更的元素。如有必要,您可以為更明確的通知定義單獨的 ContainerElementChanged
事件。
以上是是否存在一個集合可以監控其自身及其元素的變化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!