當專案更改時通知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); } }
用法
使用TrulyObserv.您需要將處理程序附加到集合的 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中文網其他相關文章!