List <T> vs BindingList <T>优点/缺点


91

有人可以描述我的项目两者之间的区别。

目前,我有一个List<MyClass>,并将BindingSource设置为那个,并将DataGridView设置为BindingSource。

我已经实现了,IEditableObject所以当调用CancelEdit时,我将对象恢复为原来的状态Memberwise.Clone()

将我的列表更改为BindingList可以解决任何问题吗?使用BindingList有什么优点?

Answers:


123

A List<>只是一个具有给定类型的项目的自动调整大小的数组,带有几个辅助函数(例如:sort)。只是数据,您可能会使用它对模型中的一组对象运行操作。

A BindingList<>是围绕类型化列表或集合的包装,该包装实现了IBindingList接口。这是支持双向数据绑定的标准接口之一。它通过实现ListChanged事件来工作,在添加,删除或设置项目时会引发该事件。绑定控件侦听此事件,以便知道何时刷新其显示。

当您将BindingSource的DataSource设置为时List<>,它将在内部创建一个BindingList<>包装列表的列表。BindingList<>如果您想在BindingSource之外访问列表,则可能需要用自己来包装列表,否则,它是相同的。您还可以从继承BindingList<>以实现更改项目时的特殊行为。

IEditableObject由BindingSource处理。当您更改任何绑定控件中的数据时,它将在任何实现对象上调用BeginEdit。然后,您可以在BindingSource上调用EndEdit / CancelEdit,它将把它传递给您的对象。移动到另一行也将调用EndEdit。


当前,使用我的List <T>方法调用CancelEdit不会将正在编辑的项目返回到其原始状态,因此为什么我要使用Clone()。您是说绑定列表将为我处理吗?
乔恩

3
不,BindingList与该功能无关。无论基础列表的类型如何,BindingSource都仅对当前对象调用CancelEdit。框架中没有任何东西可以自动实现普通对象的对象版本控制。您可以使用DataTables / DataRows,仅出于此目的而保留数据的原始副本。
Alex J 2010年

您说控件需要知道列表何时更改,您能否进一步说明?我有一个带有datagridview的表单,然后是另一个带有填充数据的表单。我需要担心自己在这件事上的言论吗?
乔恩

例如,DataGrid需要知道何时将项目添加到列表中以添加新行。为此,它使用BindingList的ListChanged事件。如果将网格直接绑定到List <T>,则不会发生该事件,并且网格将无法得知更改列表的时间。您无需担心这种情况,因为BindingSource为您将List <T>包装在BindingList中。只要您使用BindingSource而不是列表本身,控件将保持同步。
Alex J

是否有任何变通办法使用BindingList到WPF UI(mvvm方式)?我可以将绑定列表包装到一个observablecollection吗?
Lance

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.