An 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 и ICollectionView
(и, IPagedCollectionView
если я хорошо помню).
BindingList
?Практическое отличие состоит в том, что BindingList предназначен для WinForms, а ObservableCollection - для WPF.
С точки зрения WPF, BindingList не поддерживается должным образом, и вы бы никогда не использовали его в проекте WPF без необходимости.
источник
Наиболее важные различия, такие как функции и уведомления об изменениях в содержащихся элементах, уже упомянуты в принятом ответе, но есть и другие, о которых также стоит упомянуть:
Производительность
Когда
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
это ссылочный тип, изменения в элементах будут видны из исходной коллекции, но сама коллекция не будет обновлена.источник
Еще одна большая разница между
ObservableCollection
и тем,BindingList
что пригодится, и может быть фактором принятия решения по теме:BindingList
Обработчик изменения списка:ObservableCollection
Изменение коллекции:Выше заключение в отношении
INotifyPropertyChanged
реализованных в модельных классах. По умолчанию никто не вызывает измененное событие, если свойство изменено в элементе.источник