2009-01-18 15 views
22

He desarrollado algunas aplicaciones de Winforms basadas en datos 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 definición siguiente (hay algunos objetos e interfaces personalizados, combinados con elementos del marco):ObservableCollection (Of T) vs BindingList (Of T)?

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

En la misma biblioteca central , 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 de 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 se puede ver, yo uso todo el material que se necesita para el enlace de datos correcto en Windows Forms:

  • 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 de Winforms a WPF para la capa de IU.

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 usando Linq to Objects en mis proyectos, por lo que no tengo restricciones al mantener mis proyectos basados ​​únicamente en framework 2.0.

Gracias,

CLABER

Respuesta

13

Claber,

Me gustaría mantener el BindingList, porque BindingList soporta más interfaces y más ricos de la característica de ObservableCollection. Por ejemplo:

  1. BindingList implementa IList of 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.

+0

'ObservableCollection' es seguro para subprocesos, no sé sobre BindingList. – Shimmy

+10

Eso no es correcto. La documentación de Microsoft establece explícitamente que el ObservableCollection no es seguro para subprocesos. http://msdn.microsoft.com/en-us/library/ms668604.aspx – kevindaub

+11

primera afirmación es errónea ya ObservableCollection hereda Colección y Colección sí implementa la interfaz iList . –

13

Creo que su 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 a los cambios en sus hijos, pero sólo de poner y quitar eventos.

En el otro lado, BindingList escucha los cambios y actualizaciones que sus hijos plantean. 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.

Esperamos que esto ayude :)

--Bruno

+0

BindingList escucha cada elemento (es hijo, ¿supongo?) Dentro de la colección porque si un elemento dentro de la colección cambia, BindingList pasa ese mensaje a la cuadrícula o control para actualizar esa única celda o valor. Esto significa que toda la fila no necesita actualizar sus valores. Específico para DataGridView, si actualiza una fila, y no una celda individual, en la fila que está editando, los cambios desaparecerán. Solo depende de tus necesidades. – TamusJRoyce

2

Adición mi granito de arena a un tema más:

al enlazar cualquiera de estas colecciones genéricas a un WinForms DataGridView de datos y propiedades a continuación, actualizar en los datos de origen para varias filas seleccionadas, verá:

  1. El ObservableCollection<T> solo actualizará los valores de celda de la selección más reciente ted fila.
  2. El 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 un problema para aquellos que no lo conocen.

Cuestiones relacionadas