.net ObservableCollection和BindingList的区别

k4emjkb1  于 2023-11-20  发布在  .NET
关注(0)|答案(5)|浏览(174)

我想知道ObservableCollectionBindingList之间的区别,因为我已经使用两者来通知Source中的任何添加/删除更改,但实际上我不知道何时更喜欢其中一个。
为什么我会选择下面的其中一个?

ObservableCollection<Employee> lstEmp = new ObservableCollection<Employee>();

字符串

BindingList<Employee> lstEmp = new BindingList<Employee>();

piwo6bdm

piwo6bdm1#

ObservableCollection可以像任何集合一样从UI更新。真正的区别是相当简单的:
ObservableCollection<T>实现了INotifyCollectionChanged,当集合被更改时提供通知(你猜对了^^)它允许绑定引擎在ObservableCollection更新时更新UI。
但是,BindingList<T>实现了IBindingList
IBindingList提供了关于集合更改的通知,但不仅如此。它提供了一系列功能,可供UI使用,以提供更多的东西,而不仅仅是根据更改进行UI更新,例如:

  • 分选
  • 搜索
  • 通过工厂添加(AddNew成员函数)。
  • 只读列表(CanEdit属性)

所有这些功能在ObservableCollection<T>中均不可用
另一个区别是BindingList在其项目实现INotifyPropertyChanged时中继项目更改通知。如果项目引发PropertyChanged事件,BindingList将接收它并引发ListChangedType.ItemChangedOldIndex=NewIndexListChangedEvent(如果项目被替换,则为OldIndex=-1)。ObservableCollection不会中继项目通知。
请注意,在Silverlight中,BindingList不是一个选项:但是您可以使用ObservableCollection s和ICollectionView(如果我记得好的话,还有IPagedCollectionView)。

pepwfjgg

pepwfjgg2#

实际上的区别是BindingList用于WinForms,而ObservableCollection用于WPF。
从WPF的Angular 来看,BindingList没有得到正确的支持,除非真的必须使用,否则您永远不会在WPF项目中真正使用它。

tvz2xvvm

tvz2xvvm3#

最重要的区别,例如关于所包含元素的功能和更改通知,已经在接受的答案中提到,但还有更多,也值得一提:

业绩

AddNew被调用时,BindingList<T>通过IndexOf查找来搜索添加的项。如果T实现了INotifyPropertyChanged,则IndexOf也会搜索已更改元素的索引(尽管只要同一项重复更改就不会有新的查找)。如果在集合中存储数千个元素,那么ObservableCollection<T>(或者一个查找成本为O(1)的定制IBindingList实现)可能更可取。

完整性

  • IBindingList接口是一个巨大的接口(可能不是最干净的设计),并允许实现者只实现其功能的一个子集。例如,AllowNewSupportsSortingSupportsSearching属性告诉是否可以使用AddNewApplySortFind方法,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是引用类型,则元素的更改将在原始集合中可见,但集合本身不会更新。
watbbzwu

watbbzwu4#

ObservableCollectionBindingList之间还有一个很大的区别,这很方便,并且可以成为主题的出价决定因素:

BindingList列表更改提示:


的数据

ObservableCollection收藏变化:


**上述内容简介:**如果在BindingList中一个项目的属性被改变,ListChanged事件会给予你完整的属性细节(在PropertyDescriptor中),而ObservableCollection不会给你。实际上ObservableCollection不会为一个项目中改变的属性引发change事件。

上面的结论是关于INotifyPropertyChanged在模型类中实现的。默认情况下,如果一个项目中的属性被更改,则不会引发changed事件。

iovurdzv

iovurdzv5#

两者都有优点和缺点,需要一些时间才能发现。
我在使用BindingList时遇到了一些麻烦,因为更改通知事件只在 * 一个项目被删除后 * 才发生,并且只提供一个索引(这意味着如果您实现了一些删除后机制,则必须跟踪哪个对象位于哪个位置)。
BindingList有一个方便的AddNew()方法,它允许派生类实现工厂模式,例如使用依赖于父集合的值初始化新项(例如,如果集合包含子项,则使用父集合的外键)。
还请注意,使用(实体框架中的ToBindingList扩展)从ObservableCollection获取BindingList非常容易,并且返回(派生)的BindingList实现了普通BindingList中缺少的功能,如排序。

相关问题