So benachrichtigen Sie ObservableCollection, wenn sich Elemente ändern
Die ObservableCollection-Klasse in .NET bietet eine Möglichkeit, Änderungen an einer Sammlung zu verfolgen, z. B. das Hinzufügen oder Gegenstände entfernen. Änderungen an den Eigenschaften von Elementen innerhalb der Sammlung werden jedoch nicht automatisch erkannt.
Um dieses Problem zu beheben, gibt es benutzerdefinierte Implementierungen, wie z. B. die in der Frage erwähnte TrulyObservableCollection. Diese Klasse erweitert ObservableCollection und fügt Ereignishandler für Elemente hinzu, die zur Sammlung hinzugefügt und daraus entfernt werden. Es verfolgt auch Eigenschaftsänderungen an einzelnen Elementen.
Implementierung und Verwendung
Um TrulyObservableCollection zu verwenden, erstellen Sie zunächst eine Instanz und füllen diese mit Elementen:
public class MyViewModel { public TrulyObservableCollection<MyType> MyItemsSource { get; set; } public MyViewModel() { MyItemsSource = new TrulyObservableCollection<MyType>(); MyItemsSource.Add(new MyType() { MyProperty = false }); MyItemsSource.Add(new MyType() { MyProperty = true }); MyItemsSource.Add(new MyType() { MyProperty = false }); } }
Die Implementierung von TrulyObservableCollection löst jedoch immer dann ein Reset-Ereignis für die gesamte Sammlung aus, wenn sich eine Elementeigenschaft ändert. Dies kann Auswirkungen auf die Leistung haben und ist möglicherweise nicht das gewünschte Verhalten.
Alternativer Ansatz
Ein alternativer Ansatz besteht darin, Ereignishandler für Eigenschaftsänderungen für jedes Element in der Sammlung direkt zu registrieren :
public class MyViewModel { public ObservableCollection<MyType> MyItemsSource { get; set; } public MyViewModel() { MyItemsSource = new ObservableCollection<MyType>(); MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged; MyItemsSource.Add(new MyType() { MyProperty = false }); MyItemsSource.Add(new MyType() { MyProperty = true }); MyItemsSource.Add(new MyType() { MyProperty = false }); } private 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; } private void MyType_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "MyProperty") DoWork(); // Perform desired action } }
Durch die Registrierung von Ereignishandlern für Eigenschaftsänderungen nur für Elemente, wenn diese zur Sammlung hinzugefügt oder daraus entfernt werden, zielt dieser Ansatz effektiver auf Änderungen von Elementeigenschaften ab und vermeidet gleichzeitig Leistungseinbußen.
Das obige ist der detaillierte Inhalt vonWie kann eine ObservableCollection effizient über Änderungen der Elementeigenschaften benachrichtigt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!