监控集合和元素属性变化的ObservableCollection
问题:
是否存在一种集合能够同时监控集合本身的变化和其元素的属性变化?
解决方案:
如果没有现成的集合满足此需求,您可以创建一个扩展ObservableCollection
的实现,来监控其元素的PropertyChanged
事件。
实现:
以下是一个ObservableCollectionEx
的示例实现,它实现了这个功能:
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. } }
用法:
像使用普通的ObservableCollection
一样使用ObservableCollectionEx
,但将其转换为INotifyPropertyChanged
以订阅其元素的属性更改事件:
ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>(); ((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();
注意: ContainedElementChanged
方法中,OnPropertyChanged
的参数需要是新的 PropertyChangedEventArgs
实例,而不是直接使用 e
。 这已经在上文的代码中进行了更正。 这确保了正确的属性名被传递到事件处理程序。
以上是是否存在可跟踪集合和元素属性更改的 ObservableCollection?的详细内容。更多信息请关注PHP中文网其他相关文章!