J'ai une sous-classe de Bien sûr, nous pourrions définir manuellement le parent lorsque vous l'ajoutez à la collection, mais je déteste la logique non automatisée comme celle-ci, car il n'y a rien à appliquer correctement. Laisser la collection (bien, la liste) disent automatiquement "hé ... tu es ajouté, je vais donc mettre votre parent à la classe qui me possède." Est ce que je suis après. P>
Ma pensée est à au lieu de la sous-classe Cela dit, est-il un moyen d'écouter les modifications apportées à la liste Liste
locationlist code>. Ceci est un moyen pratique pour nous d'ajouter d'autres propriétés (comme
isexpandedd code> et de telle que nous pouvons utiliser dans l'interface utilisateur. BON assez. Mais maintenant, nous voulons que chaque emplacement soit conscient de son parent. En tant que tel , nous devons être notifiés lorsque quelque chose est ajouté à la liste de localisation, mais vous ne pouvez pas remplacer
ajouter code> et
supprimer code>. Pendant que nous pouvons utiliser Observablecollection, c'est plus d'une vue / viewmodel construire. Ce sont des données de modèle pures. p>
List
Liste
6 Réponses :
** Mise à jour ** p>
En réalité, ce qui précède est incorrect, c'est voir Cette réponse . P> Liste
insertItem
removeItem
collection
Collection
Si vous allez remplacer insertItem / removeItem, pourquoi n'utilisez-vous pas simplement une version où le travail est déjà effectué (observablecollection)
Observablecollection est vraiment optimisé davantage pour la viewModel que le modèle. La seule personne qui doit être consciente du changement est la collection elle-même. Vous n'avez pas besoin de la génération de notification de changement complet.
@Marqueiv: "Je ne peux même pas accepter votre réponse pour une autre onze minutes" - tout aussi bien que la réponse initiale était fausse - trop rapide de la marque. Voir la mise à jour et acceptez la réponse de Michael Stum!
@Joe, j'ai peut-être parlé trop tôt. Je ne vois pas l'un ou l'autre de ces objets sont proposés dans l'intellisense pour la liste
@Joe, je vois ceux qui sont sur la collection
@Joe, déjà eu! :) Néanmoins ... da * n J'aime à quelle vitesse la communauté peut aider un gars à 1 heure du matin. :) Presque aussi vite que de googler ce genre de choses, sauf avec des personnes réelles pour discuter des pièges et des mises en garde au lieu de simplement des pages reliées qui peuvent ou non correspondent.
Changez votre liste de localisation pour hériter de Source: Directives de conception-cadre, deuxième édition, page 251: p>
Collection
Liste
Liste
Cela semble être le plus facile à mettre en œuvre ... Il suffit de changer la liste
Cependant, ce faisant, des ruptures peuvent être capables d'énumérer sur la collection interne puisqu'elle est à l'intérieur. P> blockQuote>
Ce n'est pas vrai en supposant que vous suivez la technique appropriée et implémentez
iEnumerable code> et
icollection code> p> p>
Mais j'utiliserais une collection observable au lieu de réinventer la roue. P>
Et bien sûr, vous pouvez utiliser Extensions réactives pour faire ce dont vous avez besoin. p>
Je ne pense pas que vous ayez besoin d'une iCollection. Je pense que iEnumerable suffit. Cela dit, il ressemble à la réponse de @anthony Pegramram est celui qui gère cette affaire ... juste déléguer à la collection interne. Cependant, il suffit de changer la classe de base de la liste
ma pensée est à au lieu de la sous-classe Liste à la place pour créer juste une classe droite qui utilise un Liste en interne, puis je peut simplement exposer mon propre ajout / supprimer méthodes et gérer les ajustements à «Parent» là-bas. Cependant, ce faisant pauses à pouvoir énumérer sur la collection interne depuis qu'il est à l'intérieur. P>
Vous pouvez toujours implémenter
iEnumerable
code> sur votre collection personnalisée. Utilisez la liste <> code> en tant que détail de la mise en œuvre interne de la classe, et vous pouvez autoriser l'énumération via l'interface. P>
xxx pré> blockQuote>
Mieux pourrait être de mettre en œuvre ilist
@siride, bien sûr, il peut implémenter le iList Beefier
getenumerator code> approprié), il est tout simplement plus idiomatique à le faire.
@Antthony, vous permettant simplement de vous faire savoir que j'étais sur le point de marquer cela comme la réponse, mais cela ressemble à la chose plus simple à faire avec toujours à satisfaire tous nos besoins est juste de le changer de la liste
Vous pouvez utiliser modèle d'observateur p>
C'est un peu surkill pour simplement exposer l'interface iEnumerable d'une collection interne. Si je suis allé avec la sous-classe pure, le graphique d'objet ne s'aligne pas. Ne ressemble pas à ce que c'est le modèle approprié pour ce cas d'utilisation.
Essayez le générique BindingList
Voir mes commentaires concernant Observablecollection
@Marque: Vous réalisez que vous réalisez qu'il existe un événement dédié aux articles ajoutés et que la collection ne détecte pas les modifications (les éléments eux-mêmes et uniquement des types qui implémentent inotifypropertychangned). Donc, je pense que ce surpeuplement supplémentaire que vous êtes inquiet ne existe pas réellement. L'appel de délégué et de la fonction virtuelle sont presque exactement le même coût.
En fait, lorsque vous remplacez la collection
@Marque: Pourriez-vous garder vos commentaires sur le sujet? Ma réponse à propos de BindingList
BindingList
. Principalement, vous êtes confus sur les frais généraux des événements, cependant. Un design axé sur l'événement tel que inotifyPropertychanged code> interface est implémenté par le type d'objet contenu
BindingList
Je crois que je suis sur le sujet. J'ai précisément dit que votre suggestion ajoute beaucoup plus que nécessaire et que vous avez répondu à discuter de notifications et d'ilistpropertychangned des objets enfants. De plus, il contenait des informations incorrectes. Votre commentaire "... la collection ne détecte pas les modifications (les articles eux-mêmes et uniquement des types qui implémentent inotifyPropertychanged)." est en fait en arrière. BindingList
Un autre commentaire Re: Toi "L'appel de la délégation et l'appel de la fonction virtuelle sont presque exactement le même coût". Je pense que ça manque le point. Même si la liaison
@MARQUEIV: Est-ce que emplacement code> implémente
inotifypropertychanged code>? Sinon, il n'y a pas d'appels aux changements au sein des enfants. N'oubliez pas que l'écoute i> n'est pas une action, élever i> un événement est l'action. Les enfants qui suivent les changements de propriété soulèvent un événement, lequel
BindingList
BindingList
Et lorsque le type ne met pas en œuvre inotifypropertychanged code>, rien ne se passe. Pour votre cas particulier,
collection
BindingList code> vous permettrait de traiter des éléments ajoutés et supprimés, sans avoir à mettre en œuvre une nouvelle sous-classe.
Non, l'emplacement n'est pas. Bon point là-bas. C'est purement des données. Mais si cela le faisait, ce serait quelque chose d'extra adopté par rapport à la liaison à laquelle nous n'avons pas besoin. Encore une fois, la seule chose dont nous avons besoin est que la collection de savoir que quelque chose a été inséré ou retiré de lui-même, qu'une sous-classe de collection
@MarqueIv: correct, et c'est tout ce que les articles enfants doivent générer les notifications de changement sont l'auditeur.