Notifier ObservableCollection lorsque l'élément change
ObservableCollection est un type de collection pratique qui implémente l'interface INotifyCollectionChanged, qui vous permet d'écouter les modifications dans la collection . Cependant, ObservableCollection ne notifie pas les modifications apportées aux propriétés des éléments de la collection.
Surmonter la limitation
Pour résoudre cette limitation, vous pouvez implémenter une ObservableCollection personnalisée. appelé TrulyObservableCollection, qui hérite d'ObservableCollection et remplace le gestionnaire d'événements CollectionChanged pour s'abonner et se désinscrire du Événement PropertyChanged des éléments ajoutés et supprimés de la collection.
TrulyObservableCollection
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); } }
Utilisation
Pour utiliser TrulyObservableCollection, remplacez simplement ObservableCollection par TrulyObservableCollection dans votre code. Vous devez attacher des gestionnaires à l'événement CollectionChanged de la collection pour gérer les modifications.
MyItemsSource = new TrulyObservableCollection<MyType>(); MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;
Dans le gestionnaire d'événements CollectionChanged, vous pouvez vous abonner ou vous désabonner aux événements PropertyChanged des éléments ajoutés et supprimés de la collection.
void MyItemsSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.NewItems != null) foreach (MyType item in e.NewItems) item.PropertyChanged += new PropertyChangedEventHandler(MyType_PropertyChanged); if (e.OldItems != null) foreach (MyType item in e.OldItems) item.PropertyChanged -= new PropertyChangedEventHandler(MyType_PropertyChanged); }
Approche alternative
Pendant TrulyObservableCollection vous permet de forcer les notifications de modification de collection, ce n'est peut-être pas l'approche la plus optimale. Un modèle plus courant consiste à gérer les événements PropertyChanged d’éléments individuels dans le gestionnaire CollectionChanged d’ObservableCollection. Cela garantit que seules les modifications de propriétés spécifiques au sein de la collection entraînent des mises à jour de l'interface utilisateur, optimisant ainsi les performances et offrant un contrôle plus granulaire.
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!