2009-12-20 3 views
7

ObservableCollection met en œuvre les deux INotifyCollectionChanged et INotifyPropertyChanged.Quel est le but d'avoir implémenté INotifyPropertyChanged sur ObservableCollection?

  • Je comprends que les ajouts, suppressions (+ clair), et le remplacement des articles sont à déclaration obligatoire aux consommateurs par l'événement de collection CollectionChanged, et que les mises à jour dans les articles existants peuvent être surveillé en utilisant le articles 'événement PropertyChanged si elles mettent en œuvre eux-mêmes INotifyPropertyChanged.

  • Je lis des autres que vous ne pouvez pas inscrire sur l'événement de la collection PropertyChanged parce qu'il est en lecture seule.

Alors, quel est son but, quelle utilisation pouvons-nous faire de ce?

Les commentaires ici et là semblent rendre la discussion confuse en impliquant que la magie de ObservableCollection est de mettre en œuvre les deux interfaces, permettant d'être notifié à la fois pour la collection et les changements de contenu des éléments, alors que cela n'est pas correct. de nombreux exemples où la collection est liée à une liste déroulante qui est mise à jour de façon magique après le changement du contenu des éléments, ce qui suggère que la collection informe la liste).

En fait, il semble que la seule supériorité de la collection est de mettre en œuvre INotifyCollectionChanged. Traiter avec des éléments propriété modifications ne semble pas du tout facile avec ObservableCollection qu'avec une autre collection: il est possible que si les articles met en œuvre INotifyPropertyChanged, qu'ils ne peuvent pas faire, et si l'utilisateur parvient à accrocher cet événement indépendamment de la collection.

Est-ce correct?

Répondre

1

Juste une supposition: si l'on peut être averti des changements à la propriété Count de la collection? Mécanisme de fixation

3

WPFs peuvent utiliser INotifyPropertyChanged (INPC) hors de la boîte.

INPC comme son nom l'indique permet WPF de détecter les changements de propriétés d'objet qui peuvent ou ne peuvent pas faire partie d'une collection. ObservableCollection (OC) implémente INotifyCollectionChanged (InCC) où comme vous le dites la collection elle-même informe WPF (et toute personne équipée pour gérer les mises à jour) des mises à jour de sa collection d'éléments (suppressions d'additions, etc.). Si l'OC contient des objets qui n'implémentent pas eux-mêmes INpc, WPF n'a aucun moyen de savoir comment les propriétés de chaque élément ont changé.

Mise à jour

En répondant à la question suivante « peut-on compter sur la collecte des événements INPC au lieu de vous inscrire sur chaque nouvel élément pour être informé? » La réponse est non. Si chaque élément n'implémente pas Inpc sur ses propriétés, WPF n'a aucun moyen de savoir quelles valeurs ont changé par élément.

WPF sait toujours à partir de l'OC lorsque les éléments ont été ajoutés ou supprimés en partie. La propriété Items utilise INpc pour notifier des mises à jour, tout comme n'importe quelle classe implémentant INpc sur ses propriétés. InCC est implémenté pour suivre les changements de collection et non les valeurs sur chaque élément des éléments.

9

Si vous regardez le code source ObservableCollection<T> avec réflecteur, vous pouvez voir que cet événement est déclenché pour deux propriétés:

this.OnPropertyChanged("Count"); 
this.OnPropertyChanged("Item[]"); 

Notez que ObservableCollection<T> met en œuvre INotifyPropertyChanged explicitement, afin que vous puissiez accéder à l'événement PropertyChanged que par une variable INotifyPropertyChanged:

INotifyPropertyChanged inpc = myObservableCollection; 
inpc.PropertyChanged += myEventHandler; 
+0

alors que je suis factuellement exacte et concise ne sais pas comment cela répond à la « ce qui est donc le but? » partie du Q – Andrew

+2

Le but est d'informer les abonnés que la collection a changé. Dans cet aspect, il sert le même but que l'événement CollectionChanged, mais INotifyPropertyChanged est plus largement supporté que INotifyCollectionChanged –

+0

comme dans le cas où quelque chose se lie au compte de la collection. – dan

Questions connexes