que winforms data-binding observablecollection bindinglist

winforms - que - observablecollection methods



ObservableCollection(Of T) vs BindingList(Of T)? (3)

He desarrollado algunos datos de Winforms Application en los últimos dos años y todo funciona bien. Esta aplicación está construida en capas (DataAccess, Business Logic y UI). Para la Lógica de Businness, todos mis objetos heredan de una clase base llamada BaseEntity con la siguiente definición (hay algunos objetos e interfaces personalizados, combinados con elementos de framework):

Public MustInherit Class BaseEntity Inherits SerializableObject Implements IEntity Implements IComparer, _ IEditableObject, _ INotifyPropertyChanging, INotifyPropertyChanged, _ IApplicationSecurity End Class

En la misma biblioteca principal, tengo una colección base genérica BaseEntityCollection. Esta colección me permite definir, para cada objeto, su colección fuertemente tipada relacionada, que es muy interesante, en aplicaciones basadas en datos. Aquí está su definición base:

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

Como puede ver, utilizo todo lo que se necesita para el enlace de datos correcto en Winforms:

  • INotifyPropertyChanged, INotifyPropertyChanging, IEditableObject para el objeto.
  • Una colección basada en BindingList (Of T) para mi colección.

También me interesan las nuevas tecnologías, así que recientemente vi un webcast sobre WPF. En este webcast, utilizan como clase base para la colección y el soporte de datos ObservableCollection (Of T).

Estoy pensando en migrar algunas de mis aplicaciones desde Winforms a WPF para la capa UI.

Mi pregunta es, para mi lógica empresarial, ¿es mejor mantener mis colecciones basadas en BindingList (Of T) o debería cambiar mi clase de colección base para que herede de ObservableCollection (Of T)? Me gustaría mantener una colección base única para todos mis proyectos, que se pueda usar también en aplicaciones de Winforms, aplicaciones WPF o ASP.NET. También estoy utilizando Linq to Objects en mis proyectos, por lo que no tengo restricciones al mantener mis proyectos basados ​​únicamente en Framework 2.0.

Gracias,

ClaBer


Agregando mis dos centavos a un tema anterior:

Cuando se vinculan datos de estas colecciones genéricas a WinForms DataGridView y luego se actualizan las propiedades en los datos de origen para varias filas seleccionadas, verá:

  1. El ObservableCollection<T> solo actualizará los valores de celda de la fila seleccionada más recientemente.
  2. BindingList<T> actualizará los valores de celda de todas las filas seleccionadas.

Creo que cada uno tiene sus ventajas y desventajas, pero el ejemplo anterior puede ser una sorpresa para aquellos que no lo saben.


Claber,

Mantendría BindingList porque BindingList admite más interfaces y más características que ObservableCollection. Por ejemplo:

  1. BindingList implementa IList de T, mientras que ObservableCollection no lo hace.
  2. BindingList implementa la interfaz ICancelAddNew que los mecanismos de enlace de datos utilizan para cancelar el elemento recién agregado (cuando hizo clic en escape después de agregar una fila a DataGridView, la fila desaparece).

Soy muy nuevo en WPF y no conozco las ventajas específicas que ofrece ObservableCollection.

Espero que esto ayude.


Creo que tu respuesta está ahí: http://xceed.com/CS/blogs/dontpanic/archive/2009/04/01/i-notify-we-notify-we-all-wait-no-we-don-t.aspx

Para ser breve, ObservableCollection no escucha los cambios en sus hijos, sino solo para Insertar y Eliminar eventos.

Por otro lado, BindingList escucha los cambios y las actualizaciones planteadas por sus hijos. Pero debido a que la lista de enlace debe escuchar a todos sus hijos para propagar las notificaciones de cambio, da como resultado más carga de memoria.

Espero que esto ayude :)

--Bruno