ObservableCollection über Elementänderungen benachrichtigen
In Fällen, in denen Elemente in einer ObservableCollection Änderungen unterliegen, ist es notwendig, die Sammlung über diese Änderungen zu informieren Stellen Sie sicher, dass die Benutzeroberfläche ordnungsgemäß aktualisiert wird. Das Standardverhalten von ObservableCollection reicht nicht aus, um Änderungen auf Elementebene zu beobachten, was die Suche nach alternativen Lösungen anregt.
TrulyObservableCollection
Ein Ansatz besteht darin, die TrulyObservableCollection-Klasse zu verwenden, die erweitert wird ObservableCollection und enthält einen Abonnementmechanismus für PropertyChanged-Ereignisse für seine Elemente. Dies kann wie folgt implementiert werden:
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); } }
Implementierungsprobleme
Die Verwendung von TrulyObservableCollection führt jedoch möglicherweise nicht zu den gewünschten Ergebnissen. Um ihre Fähigkeiten voll auszuschöpfen, muss die MyViewModel-Klasse einen Handler für das CollectionChanged-Ereignis von MyItemsSource registrieren:
public MyViewModel() { MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged; }
Alternativer Ansatz: Reguläre ObservableCollection
Eine alternative Methode ist um eine Standard-ObservableCollection zu verwenden und PropertyChanged-Ereignisse auf Elementebene innerhalb der CollectionChanged manuell zu abonnieren Handler:
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(); }
Bei diesem Ansatz werden UI-Aktualisierungen speziell dann ausgelöst, wenn sich die MyProperty eines Elements ändert, wodurch die Notwendigkeit grober Aktualisierungen in der gesamten Sammlung entfällt.
Das obige ist der detaillierte Inhalt vonWie kann eine ObservableCollection effizient über Änderungen auf Elementebene benachrichtigt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!