監控集合與元素屬性變化的ObservableCollection
問題:
是否存在一種集合能夠同時監控集合本身的變化和其元素的屬性變化?
解:
如果沒有現成的集合滿足此需求,您可以建立一個擴充ObservableCollection
的實現,來監控其元素的PropertyChanged
事件。
實作:
以下是一個ObservableCollectionEx
的範例實現,它實現了這個功能:
<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>
用法:
像使用普通的ObservableCollection
一樣使用ObservableCollectionEx
,但將其轉換為INotifyPropertyChanged
以訂閱其元素的屬性更改事件:
<code class="language-csharp">ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>(); ((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>
注意: ContainedElementChanged
方法中,OnPropertyChanged
的參數需要是新的 PropertyChangedEventArgs
實例,而不是直接使用 e
。 這已經在上文的程式碼中進行了更正。 這確保了正確的屬性名稱被傳遞到事件處理程序。
以上是是否存在可追蹤集合和元素屬性變更的 ObservableCollection?的詳細內容。更多資訊請關注PHP中文網其他相關文章!