ObservableCollection (Of T) против BindingList (Of T)? - PullRequest
23 голосов
/ 18 января 2009

За последние два года я разработал некоторые приложения 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, WPF Application или ASP.NET. Я также использую Linq to Objects в своих проектах, поэтому у меня нет ограничений, поскольку мои проекты основаны только на фреймворке 2.0.

Спасибо

CLABER

Ответы [ 3 ]

15 голосов
/ 05 ноября 2010

Я думаю, что ваш ответ лежит там: http://xceed.com/CS/blogs/dontpanic/archive/2009/04/01/i-notify-we-notify-we-all-wait-no-we-don-t.aspx

Короче говоря, ObservableCollection не слушает изменения в своих дочерних элементах, а только события вставки и удаления.

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

Надеюсь, это поможет:)

- Bruno

13 голосов
/ 18 января 2009

Claber,

Я бы сохранил BindingList, потому что BindingList поддерживает больше интерфейсов и больше возможностей, чем ObservableCollection. Например:

  1. BindingList реализует IList для T, тогда как ObservableCollection - нет.
  2. BindingList реализует интерфейс ICancelAddNew, который механизмы привязки данных используют для отмены вновь добавленного элемента (когда вы нажмете escape после добавления строки в DataGridView, строка исчезнет).

Я сам новичок в WPF и не знаю особых преимуществ, которые предлагает ObservableCollection.

Надеюсь, это поможет.

2 голосов
/ 13 февраля 2014

Добавление двух моих центов к старой теме:

Когда привязка данных любого из этих общих наборов к WinForms DataGridView и последующее обновление свойств в исходных данных для нескольких выбранных строк, вы увидите:

  1. ObservableCollection<T> будет обновлять только значения ячеек последней выбранной строки.
  2. BindingList<T> обновит значения ячеек всех выбранных строк.

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

...