.net 什么时候值得使用BindingSource?

.net 什么时候值得使用BindingSource?,.net,winforms,data-binding,bindingsource,.net,Winforms,Data Binding,Bindingsource,我想我已经足够了解BindingSource类的功能了——即在数据源和UI控件之间提供一个间接层。它实现了IBindingList接口,因此也支持排序。我经常使用它,没有太多问题。但我想知道我是否比应该的更经常地使用它。也许举个例子会有所帮助 假设我在表单上只有一个简单的文本框(使用WinForms),我想将该文本框绑定到一个返回字符串的类中的简单属性。在这种情况下使用BindingSource值得吗 现在假设我的表单上有一个网格,我想将它绑定到一个数据表。我现在应该使用BindingSourc

我想我已经足够了解BindingSource类的功能了——即在数据源和UI控件之间提供一个间接层。它实现了IBindingList接口,因此也支持排序。我经常使用它,没有太多问题。但我想知道我是否比应该的更经常地使用它。也许举个例子会有所帮助

假设我在表单上只有一个简单的文本框(使用WinForms),我想将该文本框绑定到一个返回字符串的类中的简单属性。在这种情况下使用BindingSource值得吗

现在假设我的表单上有一个网格,我想将它绑定到一个数据表。我现在应该使用BindingSource吗

在后一种情况下,我可能不会使用BindingSource,因为从我收集的数据表中,它提供了与BindingSource本身相同的功能。DataTable将在添加、删除行时触发正确的事件,以便网格自动更新

但是在文本框绑定到字符串的第一种情况下,我可能会让包含字符串属性的类实现INotifyPropertyChanged,以便在字符串更改时触发PropertyChanged事件。我将使用BindingSource,以便它可以侦听这些PropertyChanged事件,以便在字符串更改时自动更新文本框

到目前为止这听起来怎么样?我仍然觉得在我的理解上有一个鸿沟,这阻碍了我看到整个画面。到目前为止,这是一个相当模糊的问题,因此我将尝试问一些更具体的问题-理想情况下,答案将参考上述示例或类似的内容

(1) 在上述两个示例中使用BindingSource是否值得

(2) 开发人员似乎只是“假设”DataTable类将在正确的时间触发PropertyChanged事件。如何知道数据源是否能够做到这一点?是否有一个数据源应该实现的特定接口,以便开发人员能够假设这种行为

(3) 在考虑是否使用BindingSource时,绑定到哪个控件是否重要?还是只有数据源会影响决策?也许答案是(这看起来很合乎逻辑):控件需要足够智能来侦听PropertyChanged事件,否则需要BindingSource。那么,如何判断控件是否能够做到这一点呢?同样,开发人员是否可以寻找控件必须实现的特定接口


在过去,正是这种混乱导致我总是使用BindingSource。但是我想更准确地理解何时使用,这样我只有在必要的时候才会这样做。

嗨,我对这个主题也有些困惑。
当我使用数据表时,它们实现了所有接口。
但是,我总是使用bindingsource只是为了确保……)

我能想到的原因有一些争论

  • 同一记录集上的多个视图。(即2个具有不同排序顺序/过滤器的网格)
  • 过滤、排序,同时不更改记录本身的排序顺序(过滤/排序)
  • 由于性能原因,可以暂时禁用绑定。(当表中有重大更新时,不要侦听所有IXXChanged事件)
  • IErrorprovider在没有bindingsource的情况下从未为我工作过,但这可能是我的错

  • 我还想添加,使用BindingSource,您可以绑定到业务对象,该对象可以实现INotifyPropertyChanged事件,因此,如果数据发生更改(无论是由您的代码还是其他人的代码更改),您的UI可以自动反映更新

    很老的问题。不知道为什么到现在还没有人回答。好的,我会尝试分享我的经验

    BindingSource
    不仅仅是将控件绑定到集合的一种方式。在WinForms中工作了十多年后,我最喜欢的
    BindingSource
    的最佳功能包括:

  • 装订(当然!)
  • 货币管理(我马上就谈到这一点)
  • 一个
    BindingSource
    可以充当另一个
    BindingSource
    数据源
  • 为了充分理解这些特性,我将在DataSet的上下文中解释它们,DataSet是WinForms中使用的最常见的数据源类型,尤其是在业务应用程序中

    货币管理归结为当前记录的概念。
    DataTable
    只是
    DataRow
    s的集合,即DataTables中没有当前记录的概念。
    DataView
    的情况也是如此(另一方面,您不能直接绑定到
    DataTable
    ;当您这样做时,它实际上绑定到该
    DataTable
    DefaultView
    属性,该属性是一个
    DataView
    。您也可以创建自己的
    DataView

    货币管理在主/细节类用户界面中非常方便。因此,假设您在左窗格(Master)中有一个学生的
    列表框
    ,在右窗格中有几个文本框、组合框、复选框等,以及所选学生课程的网格(详细信息)。在数据集中,有两个名为
    Student
    Courses
    的数据表。为了简单起见,我在这里避免使用动名词(学生课程)。
    课程
    表有一个外键
    StudentID
    。以下是如何在此处设置绑定(请注意我上面列出的3个功能是如何在下面的设置中使用的):

  • 在表单中添加两个名为
    bsStudent
    bsCourses
    BindingSource
    控件
  • bsStudent
    DataSource
    设置为
    Student