C# 列表<;T>;vs绑定列表<;T>;优点/缺点

C# 列表<;T>;vs绑定列表<;T>;优点/缺点,c#,.net,winforms,data-binding,datagridview,C#,.net,Winforms,Data Binding,Datagridview,有人能描述一下我的项目两者的区别吗 目前,我有一个列表,并将BindingSource设置为该列表,将DataGridView设置为BindingSource 我已经实现了IEditableObject,所以当调用CancelEdit时,我会使用Memberwise.Clone() 将我的列表更改为BindingList会解决任何问题吗?使用BindingList有什么好处?BindingList允许使用事件进行双向数据绑定,列表在其集合更改时不会触发事件 我认为它不会解决您的特定问题。列表只是

有人能描述一下我的项目两者的区别吗

目前,我有一个
列表
,并将BindingSource设置为该列表,将DataGridView设置为BindingSource

我已经实现了
IEditableObject
,所以当调用CancelEdit时,我会使用
Memberwise.Clone()


将我的列表更改为BindingList会解决任何问题吗?使用BindingList有什么好处?

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

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

列表只是一个自动调整大小的数组,由给定类型的项组成,带有两个辅助函数(例如:排序)。它只是数据,您可能会使用它在模型中的一组对象上运行操作

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

当您将BindingSource的数据源设置为
列表时,它会在内部创建一个
BindingList
来包装列表。如果您想在BindingSource之外访问列表,您可能希望自己使用
BindingList
对列表进行预包装,但在其他方面都是一样的。您还可以从
BindingList
继承来实现更改项目时的特殊行为


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

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