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

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

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

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

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

【问题讨论】:

    标签: c# .net winforms data-binding datagridview


    【解决方案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 在其集合更改时不会触发事件。

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

    【讨论】:

      猜你喜欢
      • 2010-10-02
      • 2010-11-07
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 2011-09-09
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多