ObservableCollection(T) vs BindingList(T)?
J'ai développé certaines données en fonction Winforms Demande de ce dernier deux ans, et tout fonctionne très bien. Cette application sont construits sur des calques (DataAccess, la Logique d'Entreprise et de l'INTERFACE utilisateur). Pour le Businness Logique, tous mes objets héritent d'une classe de base appelée BaseEntity avec la définition suivante (il y a quelques objets personnalisés et des interfaces, combinés avec des éléments du cadre) :
Public MustInherit Class BaseEntity Inherits SerializableObject Implements IEntity Implements IComparer, _ IEditableObject, _ INotifyPropertyChanging, INotifyPropertyChanged, _ IApplicationSecurity End Class
Dans la même bibliothèque de base, j'ai un générique de base de la collection de BaseEntityCollection. Ces collection me permet de définir, pour chaque objet, sa relative fortement typé collection, ce qui est très interressant, dans les données en fonction des applications. Ici, c'est que c'est la base de la définition :
Public MustInherit Class BaseEntityCollection(Of T As BaseEntity)
Inherits BindingList(Of T)
Implements IEntityCollection
Implements INotifyPropertyChanged, INotifyPropertyChanging, ICopyable(Of T)
Implements IDisposable
Implements ISerializable
End Class
Comme vous pouvez le voir, je l'utilise tous les trucs qui est nécessaire pour corriger la liaison de données en Winforms :
- INotifyPropertyChanged,INotifyPropertyChanging, IEditableObject de l'objet.
- Une collection basée sur BindingList(T) pour ma collection.
Je suis aussi interresse sur les nouvelles technologies, donc, j'ai récemment regardé quelques webcast sur WPF. Dans ces webcast, qu'ils utilisent comme classe de base pour la collecte et la liaison de données de soutien ObservableCollection(T).
Je suis en train de penser sur la migration de certaines de mes applications de Winforms à WPF pour la Couche d'INTERFACE utilisateur.
Ma question est, pour mon entreprise logique, est-il mieux de garder mes collections basées sur BindingList(T) ou dois-je changer ma collection de base de la classe pour faire hériter de ObservableCollection(De T). Je tiens à garder une unique collection de base pour tous mes projets, qui peuvent être aussi bien utilisé dans des Applications Winforms, WPF Application ou ASP.NET.
Je suis aussi à l'aide de Linq to Objects dans mes projets, donc je n'ai pas de restriction en gardant mes projets fondés uniquement sur le framework 2.0.
Merci,
ClaBer
Vous devez vous connecter pour publier un commentaire.
Claber,
Je voudrais garder la BindingList, parce que BindingList prend en charge plusieurs interfaces et plus riche en fonctionnalités que ObservableCollection.
Par exemple:
Je suis très nouveau pour WPF moi-même, et ne connaissent pas les avantages spécifiques ObservableCollection offre.
Espère que cette aide.
ObservableCollection
est thread-safe, je ne sais pas à propos de BindingList.Je pense que votre réponse est là : http://xceed.com/CS/blogs/dontpanic/archive/2009/04/01/i-notify-we-notify-we-all-wait-no-we-don-t.aspx
Pour être bref, ObservableCollection n'écoute pas les changements dans ses enfants, mais seulement pour Insérer et Supprimer des événements.
De l'autre côté BindingList est à l'écoute des changements et des mises à jour soulevées par ses enfants. Mais parce que la Liaison de la liste doit écouter tous ses enfants pour propager les notifications de changement, il en résulte plus de la charge de la mémoire.
Espère que cela aidera 🙂
--Bruno
Ajouter mon grain de sel à un ancien sujet:
Lors de la liaison de données ou l'autre de ces génériques collections à un WinForms DataGridView, puis la mise à jour des propriétés de la source de données pour plusieurs lignes, vous verrez:
ObservableCollection<T>
met uniquement à jour les valeurs de cellule de la dernière ligne sélectionnée.BindingList<T>
permettra de mettre à jour les valeurs des cellules de toutes les lignes sélectionnées.Je pense qu'ils ont chacun leurs avantages et leurs inconvénients, mais l'exemple ci-dessus peut être un piège pour ceux qui ne le savent pas.