Разница между ObservableCollection и BindingList

Я хочу знать разницу между ObservableCollection и BindingList, потому что я использовал оба для уведомления о любых изменениях добавления/удаления в источнике, но на самом деле я не знаю, когда выбрать один из них.

Почему я должен выбрать одно из следующего:

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

или

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

Ответ 1

An ObservableCollection может быть обновлен из пользовательского интерфейса точно так же, как любая коллекция. Истинная разница довольно проста:

ObservableCollection<T> реализует INotifyCollectionChanged, который предоставляет уведомление при изменении коллекции (вы догадались ^^) Он позволяет механизму привязки обновлять пользовательский интерфейс при обновлении ObservableCollection.

Однако BindingList<T> реализует IBindingList.

IBindingList предоставляет уведомление об изменениях коллекции, но не только это. Он предоставляет целую кучу функциональных возможностей, которые могут использоваться пользовательским интерфейсом, чтобы обеспечить гораздо больше вещей, чем только обновления пользовательского интерфейса в соответствии с изменениями, например:

  • Сортировка
  • Поиск
  • Добавить через factory (добавить функцию-член).
  • Список Readonly (свойство CanEdit)

Все эти функции недоступны в ObservableCollection<T>

Другое отличие состоит в том, что BindingList передает уведомления об изменении элемента, когда его элементы реализуют INotifyPropertyChanged. Если элемент вызывает событие PropertyChanged, BindingList получит его, он добавит a ListChangedEvent с ListChangedType.ItemChanged и OldIndex=NewIndex (если элемент был заменен, OldIndex=-1). ObservableCollection не передает уведомления о товарах.

Обратите внимание, что в Silverlight BindingList недоступен в качестве опции: однако вы можете использовать ObservableCollection и ICollectionViewIPagedCollectionView, если я хорошо помню).

Ответ 2

Практическое различие заключается в том, что BindingList для WinForms, а ObservableCollection для WPF.

С точки зрения WPF, BindingList не поддерживается должным образом, и вы никогда бы не использовали его в проекте WPF, если вам действительно не нужно.

Ответ 3

Еще одна большая разница между ObservableCollection и BindingList, которая пригодится и может быть фактором принятия решения по теме:

BindingList Обработчик изменения списка:

Изменение списка переплетных списков

ObservableCollection Изменение коллекции:

Обсерверная коллекция коллекций изменена

Краткое изложение: Если свойство элемента изменено в BindingList, событие ListChanged даст вам полную информацию свойства (в PropertyDescriptor) и ObservableCollection не даст вам этого. по факту ObservableCollection не приведет к событию изменения для свойства изменено в элементе.

Выше вывод делается в отношении INotifyPropertyChanged, реализованного в классах моделей. По умолчанию ни один не вызывает измененное событие, если свойство изменяется в элементе.