我想知道ObservableCollection
和BindingList
之间的区别,因为我已经使用两者来通知Source中的任何添加/删除更改,但实际上我不知道何时更喜欢其中一个。
为什么我会选择下面的其中一个?
ObservableCollection<Employee> lstEmp = new ObservableCollection<Employee>();
字符串
或
BindingList<Employee> lstEmp = new BindingList<Employee>();
型
5条答案
按热度按时间piwo6bdm1#
ObservableCollection
可以像任何集合一样从UI更新。真正的区别是相当简单的:ObservableCollection<T>
实现了INotifyCollectionChanged
,当集合被更改时提供通知(你猜对了^^)它允许绑定引擎在ObservableCollection
更新时更新UI。但是,
BindingList<T>
实现了IBindingList
。IBindingList
提供了关于集合更改的通知,但不仅如此。它提供了一系列功能,可供UI使用,以提供更多的东西,而不仅仅是根据更改进行UI更新,例如:所有这些功能在
ObservableCollection<T>
中均不可用另一个区别是
BindingList
在其项目实现INotifyPropertyChanged
时中继项目更改通知。如果项目引发PropertyChanged
事件,BindingList
将接收它并引发ListChangedType.ItemChanged
和OldIndex=NewIndex
的ListChangedEvent
(如果项目被替换,则为OldIndex=-1
)。ObservableCollection
不会中继项目通知。请注意,在Silverlight中,
BindingList
不是一个选项:但是您可以使用ObservableCollection
s和ICollectionView
(如果我记得好的话,还有IPagedCollectionView
)。pepwfjgg2#
实际上的区别是BindingList用于WinForms,而ObservableCollection用于WPF。
从WPF的Angular 来看,BindingList没有得到正确的支持,除非真的必须使用,否则您永远不会在WPF项目中真正使用它。
tvz2xvvm3#
最重要的区别,例如关于所包含元素的功能和更改通知,已经在接受的答案中提到,但还有更多,也值得一提:
业绩
当
AddNew
被调用时,BindingList<T>
通过IndexOf
查找来搜索添加的项。如果T
实现了INotifyPropertyChanged
,则IndexOf
也会搜索已更改元素的索引(尽管只要同一项重复更改就不会有新的查找)。如果在集合中存储数千个元素,那么ObservableCollection<T>
(或者一个查找成本为O(1)的定制IBindingList
实现)可能更可取。完整性
IBindingList
接口是一个巨大的接口(可能不是最干净的设计),并允许实现者只实现其功能的一个子集。例如,AllowNew
,SupportsSorting
和SupportsSearching
属性告诉是否可以使用AddNew
,ApplySort
和Find
方法,BindingList<T>
本身并不支持排序,这常常让人们感到惊讶。实际上,它提供了一些虚拟方法,让派生类添加缺少的功能。DataView
类是完整的IBindingList
实现的示例; WinForms中的BindingSource
类是一个混合的例子:如果它 Package 了另一个支持排序的IBindingList
实现,它就支持排序。ObservableCollection<T>
已经是INotifyCollectionChanged
接口的一个完整的实现(它只有一个事件)。它也有虚拟成员,但ObservableCollection<T>
通常是出于与其基类Collection<T>
相同的原因派生的:用于自定义添加/删除项目(例如,在数据模型集合中),而不是调整绑定功能。**复制与 Package **
ObservableCollection<T>
和BindingList<T>
都有一个构造函数,它接受一个已经存在的列表。尽管当它们被另一个集合示例化时,它们的行为不同:BindingList<T>
充当提供的列表的可观察 * Package 器 *,在BindingList<T>
上执行的更改也将反映在底层集合上。ObservableCollection<T>
将一个新的List<T>
示例传递给基本Collection<T>
构造函数,并将原始集合的元素复制到这个新的列表中。当然,如果T
是引用类型,则元素的更改将在原始集合中可见,但集合本身不会更新。watbbzwu4#
ObservableCollection
和BindingList
之间还有一个很大的区别,这很方便,并且可以成为主题的出价决定因素:BindingList
列表更改提示:的数据
ObservableCollection
收藏变化:的
**上述内容简介:**如果在
BindingList
中一个项目的属性被改变,ListChanged
事件会给予你完整的属性细节(在PropertyDescriptor中),而ObservableCollection
不会给你。实际上ObservableCollection
不会为一个项目中改变的属性引发change事件。上面的结论是关于
INotifyPropertyChanged
在模型类中实现的。默认情况下,如果一个项目中的属性被更改,则不会引发changed事件。iovurdzv5#
两者都有优点和缺点,需要一些时间才能发现。
我在使用
BindingList
时遇到了一些麻烦,因为更改通知事件只在 * 一个项目被删除后 * 才发生,并且只提供一个索引(这意味着如果您实现了一些删除后机制,则必须跟踪哪个对象位于哪个位置)。BindingList
有一个方便的AddNew()
方法,它允许派生类实现工厂模式,例如使用依赖于父集合的值初始化新项(例如,如果集合包含子项,则使用父集合的外键)。还请注意,使用(实体框架中的
ToBindingList
扩展)从ObservableCollection
获取BindingList
非常容易,并且返回(派生)的BindingList
实现了普通BindingList
中缺少的功能,如排序。