ObservableCollection qui surveille également des modifications sur les éléments de la collection
Est là une collection BCL (ou autres) qui a les caractéristiques suivantes:
Envoie de l'événement si la collection est changé ET envoie cas si l'un des éléments dans la collection envoie un PropertyChanged
événement. Une sorte de ObservableCollection<T>
où T: INotifyPropertyChanged
et la collection est également suivi les éléments pour les changements.
Je peut encapsuler une collection observable mon auto et ne l'événement s'abonner/se désabonner quand les éléments de la collection sont ajoutés/supprimés, mais je me demandais juste si toutes les collections existantes a ce déjà?
Vous devez vous connecter pour publier un commentaire.
Fait une rapide mise en œuvre moi-même:
Admis, il serait un peu confuse et trompeuse d'avoir la PropertyChanged le feu sur la collection lors de la propriété qui a vraiment changé sur un élément contenu, mais il pourrait convenir à mon usage spécifique. Il pourrait être étendu avec un nouvel événement qui est déclenché au lieu à l'intérieur de ContainerElementChanged
Pensées?
EDIT: à noter que le BCL ObservableCollection expose l'interface INotifyPropertyChanged grâce à une mise en œuvre explicite de sorte que vous devez fournir un casting afin de la joindre à l'événement de la sorte:
EDIT2: Ajout de la gestion de ClearItems, merci Josh
EDIT3: Ajout d'un bon de désabonnement pour PropertyChanged, merci Mark
EDIT4: Wow, c'est vraiment apprendre-as-you-go :). KP a noté que l'événement a été déclenché avec la collection de l'expéditeur et non pas avec l'élément lors de la un élément contenu changements. Il a suggéré de déclarer un événement PropertyChanged sur la classe marquée avec nouveau. Cela aurait quelques questions que je vais essayer de l'illustrer avec l'exemple ci-dessous:
Vous pouvez le voir dans l'exemple que "primordial" l'événement a pour effet de bord que vous devez être extrêmement prudent sur le type de variable que vous utilisez lors de l'inscription à l'événement, car qui dicte les événements que vous recevez.
PropertyChanged
événement ne saura jamais qui a un changement de propriété, commesender
sera toujours la collection elle-même. Serait de cacher lesPropertyChanged
de l'événement avec unnew
événement et en le soulevant avec le changement de l'élément de lasender
paramètre être un moyen raisonnable pour résoudre ce problème?ContainedElementChanged
. En héritant dePropertyChangedEventArgs
et ajouter l'expéditeur àPropertyChangedEventArgs
, vous avez l'élément dans lequel le changement est survenu@soren.enemaerke:
J'aurais fait ce commentaire sur votre réponse post, mais je ne peux pas (je ne sais pas pourquoi, peut être parce que je n'ai pas beaucoup de points de rep). De toute façon, j'ai juste pensé que je devais mentionner que dans votre code que vous avez posté, je ne pense pas que le Désabonnement ne fonctionnera pas correctement car il est la création d'une nouvelle lambda en ligne et d'essayer ensuite de supprimer le gestionnaire d'événement pour elle.
Je voudrais changer les ajouter/supprimer un gestionnaire d'événement lignes à quelque chose comme:
et
Et puis changer le ContainedElementChanged signature de la méthode d':
Ce serait reconnaître que la supprimer est pour le gestionnaire de même que l'ajout et puis l'enlever correctement. Espérons que cela aide quelqu'un 🙂
Si vous voulez utiliser quelque chose de construit dans le cadre vous pouvez utiliser FreezableCollection. Ensuite, vous aurez envie d'écouter de la Un événement a changé.
Ici est un petit échantillon. Le collection_Changed méthode sera appelée deux fois.
Je voudrais utiliser ReactiveUI de l'
ReactiveCollection
:Découvrez la C5 Générique De La Collection De La Bibliothèque. L'ensemble de ses collections contiennent des événements que vous pouvez utiliser pour joindre des rappels lorsque des éléments sont ajoutés, supprimés, inséré, effacé, ou lors de la collecte des changements.
Je suis en train de travailler pour certaines extensions qui libary ici que dans un proche avenir devrait permettre un "aperçu" des événements qui pourraient vous permettre d'annuler un ajout ou modification.
@soren.enemaerke Fait une réponse pour poster un code approprié que la section des commentaires de votre réponse serait de les rendre illisibles.
Le seul problème que j'ai eu avec la solution que l'élément qui déclenche la
PropertyChanged
événement est perdu et vous n'avez aucun moyen de savoir dans lePropertyChanged
appel.Pour corriger cela, j'ai créé une nouvelle classe
PropertyChangedEventArgsEx
et changé leContainedElementChanged
méthode au sein de votre classe.nouvelle classe
des modifications à votre classe
Après cela, vous pouvez obtenir la réelle
Sender
élémentcol.PropertyChanged += (s, e)
par couléee
àPropertyChangedEventArgsEx
De nouveau, vous devez noter le
s
ici est l'ensemble d'éléments, pas l'élément qui a déclenché l'événement. D'où le nouveauSender
propriété dans lePropertyChangedEventArgsEx
classe.Rxx 2.0 contient les opérateurs qu'avec cette opérateur de conversion pour
ObservableCollection<T>
le rend facile pour atteindre votre objectif.La propriété suivante modifié de notification des motifs sont pris en charge pour
MyClass
etMyChildClass
:La façon la plus simple de le faire est de simplement faire
La BindingList classe comme été .net sence 2.0. Il sera le feu c'est
ListChanged
événement à tout moment un élément dans la collection les feux deINotifyPropertyChanged
.