List<T>与BindingList<T>的优缺点比较

103

请问有人能够描述一下对于我的项目,这两者之间的区别吗?

我目前拥有一个 List<MyClass> ,并将 BindingSource 设为该列表,再将 DataGridView 设为 BindingSource。

我已经实现了 IEditableObject,所以当调用 CancelEdit 时,我会使用 Memberwise.Clone() 将对象还原回去。

将我的 List 更改为 BindingList 会解决上述问题吗,使用 BindingList 有哪些优势?

2个回答

131

List<>是一个自动调整大小的数组,包含给定类型的项目和一些帮助函数(如:排序)。它只是数据,并且您可能会使用它来在模型中运行对象集上的操作。

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

当将BindingSource的DataSource设置为List<>时,它会在内部创建BindingList<>来包装您的列表。如果要在BindingSource之外访问列表,则可以预先使用BindingList<>进行包装,但除此之外它们是相同的。您还可以从BindingList<>继承以实现更改项时的特殊行为。

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


目前我的List<T>方法在调用CancelEdit时不会将正在编辑的项目返回到其原始状态,因此我使用Clone()。你是说BindingList会为我处理这个问题吗? - Jon
3
不,BindingList与该功能无关。BindingSource只是调用当前对象的CancelEdit,而不考虑基础列表的类型。框架中没有自动为普通对象实现对象版本控制的内容。您可以使用DataTables/DataRows,这些对象将原始数据的副本保存下来以执行此目的。 - Alex J
有没有办法在WPF UI中使用BindingList(以mvvm方式)? 我可以将BindingList包装到ObservableCollection中吗? - Lance
@Ilia Jerebtsov,我认为BindingList没有ObservableCollection的同样功能。我认为BindingList在集合更改时没有通知。但我不确定。https://dev59.com/nG855IYBdhLWcg3wiU71 - Lance
我们能否将其绑定到XAML并像ObservableCollection一样正常工作? - Lance
显示剩余4条评论

13

BindingList通过使用事件实现双向数据绑定,而List在其集合更改时不会触发事件。

我认为这并不能解决你的特定问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接