2010-11-26 3 views
206

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

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

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

или

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

ответ

255

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

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

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

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

  • Сортировка
  • Поиск
  • Добавить через завод (член AddNew функция).
  • Readonly список (CanEdit недвижимость)

Все эти функциональные возможности не доступны в ObservableCollection<T>

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

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

+13

+1 для отличного ответа – Justin 2012-08-21 19:03:03

+1

Удивительный ответ человек. Так держать. – 2014-10-11 04:34:14

16

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

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

0

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

BindingList Список изменений Handler:

BindingList List Change

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

ObervableCollection Collection Changed

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

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

Смежные вопросы