Вопрос

За последние два года я разработал несколько приложений Winforms на основе данных, и все работает нормально.Это приложение построено на слоях (доступ к данным, бизнес-логика и пользовательский интерфейс).Для бизнес-логики все мои объекты наследуются от базового класса под названием 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 (Из T) или мне следует изменить мой базовый класс коллекции, чтобы он наследовал от ObservableCollection (Из T).Я хотел бы сохранить уникальную базовую коллекцию для всех моих проектов, которую также можно использовать в приложениях Winforms, WPF или ASP.NET.Я также использую Linq для объектов в своих проектах, поэтому у меня нет ограничений, поскольку мои проекты основаны только на framework 2.0.

Спасибо,

КлаБер

Это было полезно?

Решение

Клабер,

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

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

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

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

Другие советы

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

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

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

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

--Бруно

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top