2010-11-26 16 views
206

Quiero saber la diferencia entre ObservableCollection y BindingList porque he usado ambos para notificar cualquier cambio de agregar/eliminar en Source, pero en realidad no sé cuándo preferir uno sobre el otro.diferencia entre ObservableCollection y BindingList

¿Por qué elegiría uno de los siguientes sobre el otro?

ObservableCollection<Employee> lstEmp = new ObservableCollection<Employee>(); 

o

BindingList<Employee> lstEmp = new BindingList<Employee>(); 

Respuesta

255

Un ObservableCollection se puede actualizar desde la interfaz de usuario exactamente igual que cualquier colección. La verdadera diferencia es bastante sencillo:

ObservableCollection<T> implementa INotifyCollectionChanged que proporciona una notificación cuando se cambia la colección (adivinaste ^^) Permite que el motor de enlace para actualizar la interfaz de usuario cuando el ObservableCollection se actualiza.

Sin embargo, BindingList<T> implementa IBindingList.

IBindingList proporciona una notificación sobre los cambios en la recopilación, pero no solo eso. Proporciona un montón de funcionalidad que puede ser utilizado por la interfaz de usuario para proporcionar una gran cantidad más cosas que sólo las actualizaciones de la interfaz de usuario de acuerdo con los cambios, como:

  • Clasificación
  • Buscando
  • Añadir través de la fábrica (miembro AñadirNuevo función).
  • lista de solo lectura (por CanEdit propiedad)

Todas estas funcionalidades no están disponibles en ObservableCollection<T>

Otra diferencia es que BindingList relés notificaciones de cambio de artículo al poner en práctica sus artículos INotifyPropertyChanged. Si un artículo genera un evento PropertyChanged, el BindingList lo recibirá con un aumento de ListChangedEvent con ListChangedType.ItemChanged y OldIndex=NewIndex (si se reemplazó un artículo, OldIndex=-1). ObservableCollection no retransmite notificaciones de elementos.

Nótese que en Silverlight, BindingList no está disponible como una opción: Sin embargo, puede utilizar ObservableCollection s y ICollectionView (y IPagedCollectionView si no recuerdo mal).

+13

+1 para una respuesta excelente – Justin

+1

Awesome answer man. Seguid así. –

+1

Otra cosa a considerar es el rendimiento, consulte: http://www.themissingdocs.net/wordpress/?p=465 –

16

La diferencia práctica es que BindingList es para WinForms, y ObservableCollection es para WPF.

Desde una perspectiva de WPF, BindingList no es compatible correctamente, y nunca lo usarías realmente en un proyecto de WPF a menos que realmente tengas que hacerlo.

+1

Interesante. Como Silverlight Dev, no lo sabía. Gracias. Y si desea ordenar y filtrar, las implementaciones de ICollectionView son su amigo ^^ – Eilistraee

+26

¿Por qué es "No compatible"? ViewManager (interno) se encuentra dentro del ensamblado PresentationFramework y lo admite. Enlazarlo con un Control de elementos, por ejemplo, y las notificaciones de cambio se respetan (es decir, se agregan y eliminan elementos). Si fuera específico de WinForms, ¿no debería colocarse mejor en el espacio de nombres de Formularios? –

+7

De acuerdo con David, está en el espacio de nombres System.Collections, por lo que debe ser totalmente compatible con WPF. WPF es solo una forma diferente de diseño de interfaz de usuario. – Justin

0

Uno Más gran diferencia entre ObservableCollection y BindingList que es muy útil, y puede ser un factor de decisión de oferta en el tema:

BindingList Lista Change Handler:

BindingList List Change

ObservableCollection Cambio en la colección:

ObervableCollection Collection Changed

Breve de Arriba: Si una propiedad de un elemento se cambia en BindingList, el evento ListChanged le dará los detalles completos de la propiedad (en PropertyDescriptor) y ObservableCollection no le dará ese . De hecho, ObservableCollection no generará evento de cambio para una propiedad modificada en un artículo.

Por encima de la conclusión están en lo que respecta a INotifyPropertyChanged implementado en las clases de modelo. Por defecto, ninguno aumenta el evento cambiado si se cambia una propiedad en un elemento.