通知 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
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中文網其他相關文章!