ObservableCollection (Of T) vs BindingList (Of T)?
Я разработал некоторые приложения Winforms на основе данных за последние два года, и все работает нормально. Это приложение построено на слоях (DataAccess, Business Logic и UI). Для логики Businness все мои объекты наследуются от базового класса BaseEntity со следующим определением (есть некоторые пользовательские объекты и интерфейсы в сочетании с элементами структуры):
Public MustInherit Class BaseEntity
Inherits SerializableObject
Implements IEntity
Implements IComparer, _
IEditableObject, _
INotifyPropertyChanging, INotifyPropertyChanged, _
IApplicationSecurity
End Class
В той же основной библиотеке у меня есть базовая базовая коллекция BaseEntityCollection. Эта коллекция позволяет мне определить для каждого объекта свою связанную строго типизированную коллекцию, которая очень интересна в приложениях на основе данных. Вот базовое определение:
Public MustInherit Class BaseEntityCollection(Of T As BaseEntity)
Inherits BindingList(Of T)
Implements IEntityCollection
Implements INotifyPropertyChanged, INotifyPropertyChanging, ICopyable(Of T)
Implements IDisposable
Implements ISerializable
End Class
Как вы можете видеть, я использую все, что необходимо для правильной привязки данных в Winforms:
- INotifyPropertyChanged, INotifyPropertyChanging, IEditableObject для объекта.
- Коллекция, основанная на BindingList (Of T) для моей коллекции.
Меня также интересуют новые технологии, поэтому я недавно просмотрел веб-трансляцию о WPF. В этой веб-трансляции они используются в качестве базового класса для поддержки коллекции и привязки данных ObservableCollection (Of T).
Я собираюсь перенести некоторые из моих приложений из Winforms в WPF для слоя пользовательского интерфейса.
Мой вопрос в том, что для моей бизнес-логики лучше сохранить мои коллекции на основе BindingList (Of T) или изменить класс базовой коллекции, чтобы он наследовал от ObservableCollection (Of T). Я хотел бы сохранить уникальную базовую коллекцию для всех моих проектов, которая также может использоваться в Winforms Applications, WPF Application или ASP.NET.
Я также использую Linq для объектов в своих проектах, поэтому у меня нет ограничений, сохраняя мои проекты на основе только фреймворка 2.0.
Спасибо,
CLABER
Ответы
Ответ 1
Claber,
Я бы сохранил BindingList, потому что BindingList поддерживает больше интерфейсов и обладает большей функциональностью, чем ObservableCollection.
Например:
- BindingList реализует IList из T, тогда как ObservableCollection не делает.
- BindingList реализует интерфейс ICancelAddNew, который использует механизмы привязки данных для отмены вновь добавленного элемента (когда вы щелкнули escape после добавления строки в DataGridView, строка исчезнет).
Я очень новичок в WPF и не знаю особых преимуществ, которые предлагает ObservableCollection.
Надеюсь, что это поможет.
Ответ 2
Я думаю, что ваш ответ лежит там: http://xceed.com/CS/blogs/dontpanic/archive/2009/04/01/i-notify-we-notify-we-all-wait-no-we-don-t.aspx
Чтобы быть коротким, ObservableCollection не прослушивает изменения в своих дочерних элементах, а только для вставки и удаления событий.
С другой стороны BindingList прослушивает изменения и обновления, созданные его дочерними элементами. Но поскольку список Binding должен прослушивать все его дочерние элементы для распространения уведомлений об изменениях, это приводит к большему количеству нагрузки на память.
Надеюсь, это поможет:)
- Бруно
Ответ 3
Добавление двух центов к более старой теме:
Когда данные связывают одну из этих общих коллекций с WinForms DataGridView и затем обновляют свойства исходных данных для нескольких выбранных строк, вы увидите:
-
ObservableCollection<T>
обновит только значения ячейки самой последней выбранной строки.
-
BindingList<T>
обновит значения ячеек для всех выбранных строк.
Я думаю, что каждый из них имеет свои преимущества и недостатки, но приведенный выше пример может быть для тех, кто этого не знает.