Разница между ObservableCollection и BindingList - PullRequest
227 голосов
/ 26 ноября 2010

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

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

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

или

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

Ответы [ 4 ]

270 голосов
/ 26 ноября 2010

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

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

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

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

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

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

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

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

22 голосов
/ 26 ноября 2010

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

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

1 голос
/ 16 ноября 2018

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

Производительность

Когда вызывается AddNew, BindingList<T> ищет добавленный элемент с помощью поиска IndexOf.И если T реализует INotifyPropertyChanged, индекс измененного элемента также ищется с помощью IndexOf (хотя новый поиск не выполняется, если один и тот же элемент изменяется неоднократно).Если вы храните тысячи элементов в коллекции, то ObservableCollection<T> (или пользовательская реализация IBindingList с O (1) стоимостью поиска) может быть более предпочтительной.

Полнота

  • Интерфейс IBindingList является огромным (возможно, не самым чистым дизайном) и позволяет разработчикам реализовывать только часть его функций.Например, свойства AllowNew, SupportsSorting и SupportsSearching указывают, можно ли использовать методы AddNew, ApplySort и Find соответственно.Людей часто удивляет, что BindingList<T> сама не поддерживает сортировку.На самом деле он предоставляет некоторые виртуальные методы, позволяющие производным классам добавлять недостающие функции.Класс DataView является примером для полной реализации IBindingList;однако, это не для типизированных коллекций во-первых.И класс BindingSource в WinForms является гибридным примером: он поддерживает сортировку, если оборачивает другую реализацию IBindingList, которая поддерживает сортировку.

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

Копирование и упаковка

Оба ObservableCollection<T> и BindingList<T> имеют конструктор, который принимает уже существующий список.Хотя они ведут себя по-разному, когда их экземпляры создаются другой коллекцией:

  • BindingList<T> действует как наблюдаемая оболочка для предоставленного списка, и изменения, выполненные по BindingList<T>отражаться и в базовой коллекции.
  • ObservableCollection<T>, с другой стороны, передает новый экземпляр List<T> в базовый конструктор Collection<T> и копирует элементы исходной коллекции в этот новый список.Конечно, если T является ссылочным типом, изменения в элементах будут видны из исходной коллекции, но сама коллекция не будет обновлена.
1 голос
/ 12 февраля 2016

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

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

BindingList List Change

ObservableCollection Изменение сбора:

ObervableCollection Collection Changed

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

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

...