Comment notifier ObservableCollection lorsqu'un élément change
La classe ObservableCollection dans .NET fournit un moyen de suivre les modifications apportées à une collection, comme l'ajout ou supprimer des éléments. Cependant, il ne détecte pas automatiquement les modifications apportées aux propriétés des éléments de la collection.
Pour résoudre ce problème, des implémentations personnalisées existent, telles que TrulyObservableCollection mentionnée dans la question. Cette classe étend ObservableCollection et ajoute des gestionnaires d'événements pour les éléments ajoutés et supprimés de la collection. Il suit également les modifications de propriété sur des éléments individuels.
Implémentation et utilisation
Pour utiliser TrulyObservableCollection, vous devez d'abord créer une instance et la remplir avec des éléments :
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 }); } }
Cependant, l'implémentation de TrulyObservableCollection déclenche un événement Reset pour l'ensemble de la collection chaque fois qu'une propriété d'élément change. Cela peut avoir des implications sur les performances et peut ne pas être le comportement souhaité.
Approche alternative
Une approche alternative consiste à enregistrer directement les gestionnaires d'événements de changement de propriété pour chaque élément de la collection. :
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 } }
En enregistrant les gestionnaires d'événements de changement de propriété uniquement pour les éléments lorsqu'ils sont ajoutés ou supprimés de la collection, cette approche cible plus efficacement les changements de propriété des éléments tout en évitant les performances. frais généraux.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!