ObservableCollection(Of T)vs BindingList(Of T)?

时间:2009-01-18 15:10:47

标签: winforms data-binding observablecollection bindinglist

我在过去两年里开发了一些基于Winforms Application的数据,一切正常。此应用程序构建在层(DataAccess,业务逻辑和UI)上。对于Businness Logic,我的所有对象都继承自一个名为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以用于UI层。

我的问题是,对于我的业务逻辑,最好是基于BindingList(Of T)保留我的集合,还是应该更改我的基本集合类以使其继承自ObservableCollection(Of T)。我想为我的所有项目保留一个独特的基础集合,可以在Winforms应用程序,WPF应用程序或ASP.NET中使用。 我也在我的项目中使用Linq to Objects,所以我没有限制只保留基于框架2.0的项目。

谢谢,

CLABER

3 个答案:

答案 0 :(得分:15)

我认为你的答案就在那里:http://xceed.com/CS/blogs/dontpanic/archive/2009/04/01/i-notify-we-notify-we-all-wait-no-we-don-t.aspx

简而言之,ObservableCollection不会监听其子节点的变化,只会侦听插入和删除事件。

另一方面,BindingList会侦听其子节点引发的更改和更新。但是因为绑定列表必须监听其所有子节点以传播更改通知,否则会导致更多的内存负载。

希望这会有所帮助:)

- 布鲁诺

答案 1 :(得分:13)

CLABER,

我会保留BindingList,因为BindingList支持更多接口,并且功能比ObservableCollection更丰富。 例如:

  1. BindingList实现T的IList,而ObservableCollection不实现。
  2. BindingList实现ICancelAddNew接口,数据绑定机制使用该接口取消新添加的项目(当您向DataGridView添加行后单击转义时,该行将消失)。
  3. 我自己对WPF很新,并且不知道ObservableCollection提供的具体优势。

    希望这有帮助。

答案 2 :(得分:2)

将我的两分钱加到较旧的主题上:

当数据将这些通用集合中的任何一个绑定到WinForms DataGridView,然后更新多个选定行的源数据中的属性时,您将看到:

  1. ObservableCollection<T>只会更新最近选定行的单元格值。
  2. BindingList<T>将更新所有选定行的单元格值。
  3. 我认为他们每个人都有自己的优点和缺点,但上面的例子对于那些不知道它的人来说可能是个问题。