In diesem Artikel wird das Konzept der Überwachung von Sammlungen selbst und von Änderungen an Sammlungselementen untersucht. Normalerweise benachrichtigt ObservableCollection
Änderungen an der Sammlung selbst, jedoch keine Änderungen an ihren Elementen.
Gibt es eine bestehende Sammlung, die Elementänderungen überwachen kann?
Ja, Sie können eine benutzerdefinierte Implementierung erstellen, die ObservableCollection
erweitert, um diese Anforderung zu erfüllen.
Benutzerdefinierte ObservableCollection mit Elementüberwachungsfunktionen:
Dies ist eine modifizierte ObservableCollection
Version:
<code class="language-csharp">public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged { // 订阅添加到项目中的 PropertyChanged 事件 protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { Subscribe(e.NewItems); base.OnCollectionChanged(e); } // 取消订阅从移除的项目中移除的 PropertyChanged 事件,并在清除集合时清除所有项目 protected override void ClearItems() { foreach (T element in this) element.PropertyChanged -= ContainedElementChanged; base.ClearItems(); } // 订阅元素中的 PropertyChanged 事件 private void Subscribe(IList iList) { if (iList != null) { foreach (T element in iList) element.PropertyChanged += ContainedElementChanged; } } // 取消订阅元素中的 PropertyChanged 事件 private void Unsubscribe(IList iList) { if (iList != null) { foreach (T element in iList) element.PropertyChanged -= ContainedElementChanged; } } // 当包含的元素属性更改时发出通知 private void ContainedElementChanged(object sender, PropertyChangedEventArgs e) { OnPropertyChanged(e); } }</code>
Verwenden Sie diese benutzerdefinierte Sammlung:
<code class="language-csharp">ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>(); ((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>
Hinweise zur Verwendung des PropertyChanged-Ereignisses:
Beachten Sie, dass bei Verwendung des Ereignisses PropertyChanged
für eine benutzerdefinierte Sammlung die Sammlung selbst und nicht das geänderte Element der Absender ist. Bei Bedarf können Sie separate ContainerElementChanged
-Ereignisse für explizitere Benachrichtigungen definieren.
Das obige ist der detaillierte Inhalt vonGibt es eine Sammlung, die Änderungen sowohl an sich selbst als auch an ihren Elementen überwacht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!