【问题标题】:Do I need a BindingSource AND a BindingList for WinForms DataBinding?WinForms DataBinding 是否需要 BindingSource 和 BindingList?
【发布时间】:2011-01-13 01:17:46
【问题描述】:

我想在 Windows 窗体应用程序的 DataGridView 中显示人员列表。我希望我的服务层返回一个 Person 对象列表(例如,IList<Person>)。我希望列表中的更改反映在DataGridView 中,反之亦然。我的理解是使用BindingSource 有助于使用DataGridView。我的问题是双向数据绑定工作,我需要:

//pseudo code
BindingSource.DataSource = IBindingList<Person>

或者我可以这样做:

BindingSource.DataSource = IList<Person>

有什么区别?如果我对列表进行更改,DataGridView 是否会以任何方式更新?如果我必须使用BindingList,从我的服务层返回BindingList 似乎有点不稳定(因为创建了依赖项),有没有办法解决这个问题?

微软提到BindingList(在备注部分) http://msdn.microsoft.com/en-us/library/ms132679.aspx:

“但是,典型的解决方案 程序员将使用一个类 提供数据绑定功能, 比如BindingSource,而不是 直接使用BindingList&lt;T&gt;。”

【问题讨论】:

    标签: c# winforms datagridview bindingsource bindinglist


    【解决方案1】:

    绑定到IList&lt;Person&gt; 只会给您单向绑定;对列表或列表项的更改不会反映在DataGridView 中。您可以使用BindingListBindingSource 来获取此功能,但您的Person 类仍需要支持INotifyPropertyChanged,否则您将仅在将项目添加到列表/从列表中删除时获得同步,不是当列表项本身发生变化时。

    如果你想避免对System.Windows.Forms 的依赖,你可以使用ObservableCollection&lt;Person&gt; 代替;这支持必要的更改通知,因此可以用作双向绑定源。

    【讨论】:

    • 除非他使用 .NET 4,否则 ObservableCollection 会带来更加繁重的依赖,因为它是在 WPF 程序集 (WindowsBase) 中定义的。它仅在 .NET 4 中移至 System.dll。
    • BindingList和BindingSource有什么区别?我都试过了,两者似乎都有效。一个比另一个新吗?是否应该更喜欢 BindingList 因为它是有类型的?
    • @Lernkurve 主要区别在于BindingSource 是一个WinForms 组件,而BindingList&lt;T&gt; 可用于任何类型的应用程序。 BindingSource 具有一些额外的显示/演示功能,可改善 WinForms 中的用户体验。
    【解决方案2】:

    如果您使用BindingList&lt;T&gt;,那么您通过基础列表所做的更改将反映在数据绑定控件中,因为当列表更改时,BindingList 会引发一个事件。大多数其他集合没有。

    如果您使用普通集合作为数据源,那么您通过其他数据绑定控件(或通过 BindingSource)所做的更改仍将反映,但对基础集合的直接更改不会。

    【讨论】:

    • 我的部分困惑是,有些人似乎建议您不需要使用 BindingList 来获得双向数据绑定,只要您使用的是 BindingSource。但我猜你说的是只有当你只通过 BindingSource 修改列表时才会这样。
    猜你喜欢
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2013-02-21
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多