我在过去的两年里开发了一些基于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
我想你的答案就在那里: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会侦听其子节点引发的更改和更新.但由于绑定列表必须侦听其所有子节点以传播更改通知,因此会导致更多内存负载.
希望这会有所帮助:)
- 布鲁诺
CLABER,
我会保留BindingList,因为BindingList支持更多的接口和比ObservableCollection更丰富的功能.例如:
BindingList实现T的IList,而ObservableCollection不实现.
BindingList实现ICancelAddNew接口,数据绑定机制使用该接口取消新添加的项目(当您向DataGridView添加行后单击转义时,该行将消失).
我自己对WPF很新,并且不知道ObservableCollection提供的具体优势.
希望这可以帮助.