Подтвердить что ты не робот

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

4b9b3361

Ответ 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> обновит значения ячеек для всех выбранных строк.

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