ObservableCollection, die Sammlungs- und Elementattributänderungen überwacht
Frage:
Gibt es eine Sammlung, die gleichzeitig Änderungen in der Sammlung selbst und Änderungen in den Attributen ihrer Elemente überwachen kann?
Lösung:
Wenn keine fertige Sammlung diese Anforderung erfüllt, können Sie eine Implementierung erstellen, die ObservableCollection
erweitert, um ihre Elemente auf PropertyChanged
-Ereignisse zu überwachen.
Umsetzung:
Das Folgende ist eine Beispielimplementierung von ObservableCollectionEx
, die diese Funktionalität implementiert:
<code class="language-csharp">public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged { protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { Unsubscribe(e.OldItems); Subscribe(e.NewItems); base.OnCollectionChanged(e); } protected override void ClearItems() { foreach (T element in this) element.PropertyChanged -= ContainedElementChanged; base.ClearItems(); } private void Subscribe(IList iList) { if (iList != null) { foreach (T element in iList) element.PropertyChanged += ContainedElementChanged; } } private void Unsubscribe(IList iList) { if (iList != null) { foreach (T element in iList) element.PropertyChanged -= ContainedElementChanged; } } private void ContainedElementChanged(object sender, PropertyChangedEventArgs e) { OnPropertyChanged(new PropertyChangedEventArgs(e.PropertyName)); //Corrected this line. } }</code>
Verwendung:
Verwenden Sie ObservableCollection
wie ein normales ObservableCollectionEx
, konvertieren Sie es jedoch in ein INotifyPropertyChanged
, um die Eigenschaftsänderungsereignisse seines Elements zu abonnieren:
<code class="language-csharp">ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>(); ((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>
Hinweis: In der ContainedElementChanged
-Methode muss der Parameter von OnPropertyChanged
eine neue PropertyChangedEventArgs
-Instanz sein, anstatt e
direkt zu verwenden. Dies wurde im obigen Code korrigiert. Dadurch wird sichergestellt, dass der korrekte Eigenschaftsname an den Ereignishandler übergeben wird.
Das obige ist der detaillierte Inhalt vonExistiert eine ObservableCollection, die sowohl Sammlungs- als auch Elementeigenschaftenänderungen verfolgt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!