2009-01-18 121 views
22

我最近两年开发了一些基于Winforms的数据应用程序,并且都正常工作。此应用程序构建于图层(DataAccess,业务逻辑和UI)上。ObservableCollection(Of T)vs BindingList(Of T)?

Public MustInherit Class BaseEntity 
    Inherits SerializableObject 
    Implements IEntity 
    Implements IComparer, _ 
       IEditableObject, _ 
       INotifyPropertyChanging, INotifyPropertyChanged, _ 
       IApplicationSecurity 
    End Class 

在同一核心库:对于的businness逻辑,我的所有对象由称为BaseEntity用下面的定义(有一些自定义对象和接口,与框架元件的组合)的基类继承,我有一个通用的基本集合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作为对象,所以我没有通过仅保留基于框架2.0的项目进行限制。

感谢,

CLABER

回答

13

CLABER,

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

  1. BindingList实现T的IList,而ObservableCollection不实现。
  2. BindingList实现ICancelAddNew接口,数据绑定机制用于取消新添加的项目(当您向DataGridView添加一行后单击escape时,该行将消失)。

我对WPF自己很新,也不知道ObservableCollection提供的具体优点。

希望这会有所帮助。

+0

`ObservableCollection`是线程安全的,我不知道BindingList。 – Shimmy 2010-12-27 08:58:58

+10

这是不正确的。微软的文档明确指出ObservableCollection不是线程安全的。 http://msdn.microsoft.com/en-us/library/ms668604.aspx – kevindaub 2011-02-11 19:16:58

2

添加我的两分钱,以一个老话题:

当数据绑定这两种泛型集合到一个WinForms DataGridView的,然后更新属性在多个选定行的源数据中,您将看到:

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

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