当项目更改时通知 ObservableCollection
ObservableCollection 是一个方便的集合类型,它实现了 INotifyCollectionChanged 接口,它允许您监听集合中的更改。但是,ObservableCollection 不会通知对集合中项目的属性所做的更改。
克服限制
要解决此限制,您可以实现自定义 ObservableCollection称为TrulyObservableCollection,它继承自ObservableCollection并重写CollectionChanged事件处理程序来订阅和取消订阅添加到集合中和从集合中删除的项目的 PropertyChanged 事件。
TrulyObservableCollection
public class TrulyObservableCollection<T> : ObservableCollection<T> where T : INotifyPropertyChanged { public TrulyObservableCollection() : base() { CollectionChanged += TrulyObservableCollection_CollectionChanged; } void TrulyObservableCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.NewItems != null) { foreach (Object item in e.NewItems) { (item as INotifyPropertyChanged).PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged); } } if (e.OldItems != null) { foreach (Object item in e.OldItems) { (item as INotifyPropertyChanged).PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged); } } } void item_PropertyChanged(object sender, PropertyChangedEventArgs e) { NotifyCollectionChangedEventArgs a = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset); OnCollectionChanged(a); } }
用法
使用TrulyObservableCollection,只需将 ObservableCollection 替换为代码中的 TrulyObservableCollection。您需要将处理程序附加到集合的 CollectionChanged 事件来处理更改。
MyItemsSource = new TrulyObservableCollection<MyType>(); MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;
在 CollectionChanged 事件处理程序中,您可以订阅或取消订阅从集合中添加和删除的项目的 PropertyChanged 事件。
void MyItemsSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.NewItems != null) foreach (MyType item in e.NewItems) item.PropertyChanged += new PropertyChangedEventHandler(MyType_PropertyChanged); if (e.OldItems != null) foreach (MyType item in e.OldItems) item.PropertyChanged -= new PropertyChangedEventHandler(MyType_PropertyChanged); }
替代方案方法
虽然 TrulyObservableCollection 允许您强制收集更改通知,但它可能不是最佳方法。更常见的模式是在 ObservableCollection 的 CollectionChanged 处理程序中处理单个项目的 PropertyChanged 事件。这可确保只有集合中的特定属性更改才会导致 UI 更新,从而优化性能并提供更精细的控制。
以上是如何让 ObservableCollection 在项属性更改时发出通知?的详细内容。更多信息请关注PHP中文网其他相关文章!