Maison >développement back-end >C++ >Comment puis-je créer une ObservableCollection qui surveille les modifications apportées aux propriétés de ses éléments ?

Comment puis-je créer une ObservableCollection qui surveille les modifications apportées aux propriétés de ses éléments ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-07 16:37:46667parcourir

How Can I Create an ObservableCollection That Monitors Changes in its Element Properties?

ObservableCollection pour surveiller les modifications des éléments

Énoncé du problème

Imaginez une ObservableCollection où les éléments implémentent INotifyPropertyChanged et la collection elle-même surveille ces éléments pour détecter toute modification. Bien que ObservableCollection existe, il n'est pas clair s'il existe une collection préexistante qui satisfait exactement à cette exigence.

Solution

Classe ObservableCollectionEx

La solution proposée introduit ObservableCollectionEx, qui est une extension de ObservableCollection. Dans cette implémentation :

  • OnCollectionChanged : met à jour les abonnements aux événements pour les éléments qui ont été ajoutés ou supprimés.
  • ClearItems : désabonnez-vous des modifications de propriété d'un élément avant de l'effacer.
  • S'abonner : abonnez-vous aux modifications de propriété des éléments nouvellement ajoutés.
  • Désabonnement : désabonnez-vous des modifications de propriété des éléments supprimés.
  • ContainedElementChanged : propage les modifications de propriété de l'élément à la collection.

Utilisation

ObservableCollectionEx est utilisé comme suit :

<code class="language-csharp">ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>();
((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>

Remarques

Bien que cette implémentation déclenche l'événement PropertyChanged de la collection lorsque la propriété d'un élément change, cela peut prêter à confusion. Par conséquent, un événement supplémentaire peut être introduit spécifiquement pour de tels changements.

De plus, l'implémentation ObservableCollection en BCL n'expose explicitement que l'interface INotifyPropertyChanged. L'inscription aux événements nécessite le casting suivant :

<code class="language-csharp">((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>

Notez que la désinscription de PropertyChanged nécessite de définir le gestionnaire d'événements sur null :

<code class="language-csharp">collection.PropertyChanged -= (s, e) => { Trace.WriteLine("Changed " + e.PropertyName); };</code>

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn