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

Posted

技术标签:

【中文标题】List<T> vs BindingList<T> 优点/缺点【英文标题】:List<T> vs BindingList<T> Advantages/DisAdvantages 【发布时间】:2011-01-15 16:22:33 【问题描述】:

谁能描述一下这两者对我的项目有何不同?

目前我有一个List&lt;MyClass&gt; 并将 BindingSource 设置为那个并将 DataGridView 设置为 BindingSource。

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

将我的 List 更改为 BindingList 会解决任何问题吗?使用 BindingList 有什么优势?

【问题讨论】:

【参考方案1】:

List&lt;&gt; 只是一个自动调整大小的数组,包含给定类型的项目,并带有几个辅助函数(例如:排序)。它只是数据,您可能会使用它来对模型中的一组对象运行操作。

BindingList&lt;&gt; 是类型化列表或集合的包装器,它实现了IBindingList 接口。这是支持双向数据绑定的标准接口之一。它通过实现ListChanged 事件来工作,该事件在您添加、删除或设置项目时引发。绑定控件侦听此事件以了解何时刷新其显示。

当您将 Bi​​ndingSource 的 DataSource 设置为 List&lt;&gt; 时,它会在内部创建一个 BindingList&lt;&gt; 来包装您的列表。如果您想在 BindingSource 之外访问它,您可能希望自己使用 BindingList&lt;&gt; 预先包装您的列表,否则它是一样的。您还可以从BindingList&lt;&gt; 继承来实现更改项目时的特殊行为。

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

【讨论】:

目前使用我的 List 方法调用 CancelEdit 不会将正在编辑的项目返回到其原始状态,因此我使用 Clone()。你是说绑定列表会为我处理吗? 不,BindingList 与该功能无关。 BindingSource 只需在当前对象上调用 CancelEdit,而不管基础列表的类型如何。框架中没有任何东西可以自动为普通对象实现对象版本控制。您可以使用 DataTables/DataRows,它们会为此目的保留数据的原始副本。 您说控件需要知道列表何时发生变化,您能进一步解释一下吗?我有一个带有 datagridview 的表单,然后是另一个带有填充数据的表单。我需要担心你在这件事上的言论吗? 例如,DataGrid 需要知道何时将项目添加到列表中以便添加新行。为此,它使用 BindingList 的 ListChanged 事件。如果您将网格直接绑定到 List,您将不会收到该事件,并且网格将无法知道您何时更改了列表。在您的场景中您不必担心它,因为 BindingSource 为您将 List 包装在 BindingList 中。只要您使用 BindingSource 而不是列表本身,控件就会保持同步。 是否有任何解决方法可以将 BindingList 用于 WPF UI(mvvm 方式)?我可以将绑定列表包装到 observablecollection 中吗?【参考方案2】:

BindingList 允许使用事件进行双向数据绑定,List 在其集合更改时不会触发事件。

我认为它不会解决您的特定问题。

【讨论】:

以上是关于List<T> vs BindingList<T> 优点/缺点的主要内容,如果未能解决你的问题,请参考以下文章

List<T>,ArrayList,IEnumerable的区别

c++在模板类中使用list问题

Java List单例表: Collections::singletonList VS List::of

IEnumerable<T> VS IList<T> VS IQueryable<T>

根据键将 List<List<List<T>>> 转换为 List<List<T>>

无法将参数 1 从 'VP<T>' 转换为 'VP<T> &' ,又一个 VS 错误