2010-02-12 5 views
3

Je suis intéressé par le moyen le plus efficace de modifier une collection observable de telle sorte qu'une seule propriété modifiée soit déclenchée. Disons que je veux remplir la liste avec 3 éléments, il n'y a pas de méthode addCollection ou quelque chose comme ça, donc je dois faire + 3 fois plus clair. Dois-je créer une collection observable différente et affecter? Ou quelles techniques les autres utilisent-ils?Prise en charge de transactions dans une collection observable

Répondre

2

La classe ObservableCollection de NET Framework envoie des notifications individuelles en tant que chaque élément ajouté à la collection et ne fournit aucun mécanisme pour les fonctionnalités de type AddRange. Cependant, vous pouvez très facilement créer votre propre collection qui implémente INotifyCollectionChanged et envoyer toutes les notifications que vous aimez. Le problème que vous pouvez rencontrer est que l'interface INotifyCollectionChanged inclut la possibilité de spécifier que plusieurs éléments ont été ajoutés à la collection dans un seul message, mais aucune classe NET Framework standard ne crée réellement ces notifications. Pour cette raison, certains contrôles tiers et open source qui supposent un seul élément ont été ajoutés lorsqu'ils reçoivent une notification Ajouter. Même les classes NET Framework intégrées peuvent avoir des bogues non découverts liés à cela. Pour ces raisons, je recommanderais à votre collection personnalisée d'avoir un mode dans lequel elle peut être configurée pour toujours envoyer une notification de réinitialisation à la fin d'un AddRange au lieu d'une seule notification d'ajout multi-éléments. Vous pouvez l'optimiser davantage en envoyant plusieurs notifications d'ajout à un seul élément ou une notification de réinitialisation en fonction du nombre réel d'éléments ajoutés.

Bien sûr, il existe des situations dans lesquelles il est tout aussi facile de remplacer le ObservableCollection par un nouveau. Parfois, cela sera beaucoup moins efficace que de boucler Add() car les gestionnaires d'événements et CollectionViews sont reconstruits. D'autres fois, il sera plus efficace si la collection est grande et votre boucle ajoute seulement quelques éléments à la fois. Et parfois ça ne marchera pas du tout.

+0

observable collection implémente ICollectionChanged, mais je suis sûr que c'est ce que vous vouliez dire –

+0

Merci Ray, votre réponse était insignifiante ++ :) –

+1

@Aran: Merci pour la correction. Je me suis trompé. BTW, il est en fait INotifyCollectionChanged pas ICollectionChanged (et pas ce que j'avais soit!) –

Questions connexes