24

在过去的两年里,我开发了一些基于数据的 Winforms 应用程序,一切正常。此应用程序建立在层(数据访问、业务逻辑和 UI)之上。对于业务逻辑,我的所有对象都继承自一个名为 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 迁移到 UI 层的 WPF。

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

4

3 回答 3

17

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

简而言之,ObservableCollection 不会监听其子节点的变化,而只会监听 Insert 和 Remove 事件。

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

希望这会有所帮助:)

- 布鲁诺

于 2010-11-05T13:50:26.723 回答
12

克拉伯,

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

  1. BindingList 实现了 T 的 IList,而 ObservableCollection 没有。
  2. BindingList 实现了 ICancelAddNew 接口,数据绑定机制使用该接口取消新添加的项(当您在 DataGridView 中添加一行后单击转义时,该行将消失)。

我自己对 WPF 很陌生,不知道 ObservableCollection 提供的具体优势。

希望这可以帮助。

于 2009-01-18T19:46:11.923 回答
3

将我的两分钱添加到一个较旧的主题中:

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

  1. ObservableCollection<T>只会更新最近选择的行的单元格值。
  2. BindingList<T>将更新所有选定行的单元格值。

我认为它们各有优缺点,但是对于那些不知道的人来说,上面的例子可能是一个陷阱。

于 2014-02-13T19:56:36.863 回答