Azh*_*har 234 .net c# wpf observablecollection wpf-4.0
我想知道它们之间的区别ObservableCollection,BindingList因为我已经使用了两者来通知Source中的任何添加/删除更改,但实际上我不知道何时更喜欢一个而不是另一个.
为什么我会选择以下其中一个而不是另一个?
ObservableCollection<Employee> lstEmp = new ObservableCollection<Employee>();
Run Code Online (Sandbox Code Playgroud)
要么
BindingList<Employee> lstEmp = new BindingList<Employee>();
Run Code Online (Sandbox Code Playgroud)
Eil*_*aee 277
一个ObservableCollection可以从用户界面酷似任何集合进行更新.真正的区别是相当简单:
ObservableCollection<T>INotifyCollectionChanged在更改集合时提供通知的实现(您猜到了^^)它允许绑定引擎在更新时更新UI ObservableCollection.
但是,BindingList<T>工具IBindingList.
IBindingList提供有关集合更改的通知,但不仅如此.它提供了一大堆功能,UI可以根据更改提供更多内容而不仅仅是UI更新,例如:
所有这些功能都不可用 ObservableCollection<T>
另一个区别是,BindingList当项目实现时,中继项目更改通知INotifyPropertyChanged.如果一个项目提出了一个PropertyChanged事件时,BindingList会收到一个提出了一个ListChangedEvent以ListChangedType.ItemChanged和OldIndex=NewIndex(如果一个项目被换下,OldIndex=-1).ObservableCollection不会中继项目通知.
请注意,在Silverlight中,BindingList不作为选项提供:但是您可以使用ObservableCollections和ICollectionView(IPagedCollectionView如果我记得很清楚的话).
Dea*_*alk 24
实际的区别是BindingList用于WinForms,而ObservableCollection用于WPF.
从WPF的角度来看,BindingList没有得到适当的支持,除非你真的需要,否则你永远不会在WPF项目中真正使用它.
已接受的答案已经提到了最重要的差异,例如关于所包含元素的功能和更改通知,但还有更多,这也值得一提:
表现
当AddNew被调用时,BindingList<T>通过IndexOf查找来搜索添加的项目。并且如果T实现INotifyPropertyChanged了更改元素的索引也被搜索IndexOf(尽管只要相同的项目重复更改就没有新的查找)。如果您在集合中存储数千个元素,那么ObservableCollection<T>(或IBindingList具有 O(1) 查找成本的自定义实现)可能更可取。
完整性
该IBindingList接口是一个巨大的接口(可能不是最干净的设计),并且允许实现者仅实现其功能的一个子集。例如,AllowNew,SupportsSorting和SupportsSearching属性告诉是否AddNew,ApplySort和Find方法可以分别使用,。它BindingList<T>本身不支持排序,这常常让人们感到惊讶。实际上,它提供了一些虚拟方法,让派生类添加缺少的功能。该DataView班是一个完整的例子IBindingList实施; 但是,它首先不适用于类型化集合。BindingSourceWinForms 中的类是一个混合示例:如果它包装了另一个IBindingList支持排序的实现,则它支持排序。
ObservableCollection<T>已经是INotifyCollectionChanged接口的完整实现(只有一个事件)。它也有虚拟成员,但ObservableCollection<T>通常出于与其基Collection<T>类相同的原因派生:用于自定义添加/删除项目(例如,在数据模型集合中)而不是调整绑定功能。
复制与包装
双方ObservableCollection<T>并BindingList<T>有一个构造函数,它接受一个已经存在的列表。尽管当它们被另一个集合实例化时,它们的行为有所不同:
BindingList<T>充当提供的列表的可观察包装器,对 执行的更改BindingList<T>也将反映在基础集合上。ObservableCollection<T>另一方面,将一个新List<T>实例传递给基本Collection<T>构造函数,并将原始集合的元素复制到这个新列表中。当然,如果T是引用类型,则元素上的更改将从原始集合中可见,但集合本身不会更新。| 归档时间: |
|
| 查看次数: |
57071 次 |
| 最近记录: |