通知 ObservableCollection 项目更改
如果 ObservableCollection 中的项目发生更改,则有必要将这些更改通知集合确保正确的 UI 更新。 ObservableCollection 的默认行为在观察项目级变化方面存在不足,促使人们探索替代解决方案。
TrulyObservableCollection
一种方法涉及利用 TrulyObservableCollection 类,该类扩展ObservableCollection 并包含其项目上的 PropertyChanged 事件的订阅机制。这可以按如下方式实现:
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 可能不会产生预期的结果。要充分利用其功能,MyViewModel 类必须为 MyItemsSource 的 CollectionChanged 事件注册一个处理程序:
public MyViewModel() { MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged; }
替代方法:常规 ObservableCollection
另一种方法是使用标准 ObservableCollection 并手动订阅 CollectionChanged 中的项目级 PropertyChanged 事件handler:
public MyViewModel() { MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged; // Add items to the collection MyItemsSource.Add(new MyType() { MyProperty = false }); MyItemsSource.Add(new MyType() { MyProperty = true}); MyItemsSource.Add(new MyType() { MyProperty = false }); } void MyItemsSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.NewItems != null) foreach(MyType item in e.NewItems) item.PropertyChanged += MyType_PropertyChanged; if (e.OldItems != null) foreach(MyType item in e.OldItems) item.PropertyChanged -= MyType_PropertyChanged; } void MyType_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "MyProperty") DoWork(); }
通过这种方法,当项目的 MyProperty 更改时会专门触发 UI 更新,从而无需对整个集合进行粗略更新。
以上是如何有效地通知 ObservableCollection 项目级别的更改?的详细内容。更多信息请关注PHP中文网其他相关文章!