问题 我需要一个BindingSource和一个用于WinForms DataBinding的BindingList吗?


我想显示一个人的列表 DataGridView 在Windows窗体应用程序中。我希望我的服务层返回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<T>“。


8803
2018-01-13 01:17


起源



答案:


如果你使用 BindingList<T> 然后,通过基础列表进行的更改将反映在数据绑定控件中,因为BindingList会在更改列表时引发事件。大多数其他收藏品没有。

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


3
2018-01-13 01:31



我的一部分困惑是,有些人似乎建议你只要使用BindingSource就不需要使用BindingList来获得双向数据绑定。但我猜你所说的只有你只通过BindingSource修改列表才会这样。 - User


答案:


如果你使用 BindingList<T> 然后,通过基础列表进行的更改将反映在数据绑定控件中,因为BindingList会在更改列表时引发事件。大多数其他收藏品没有。

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


3
2018-01-13 01:31



我的一部分困惑是,有些人似乎建议你只要使用BindingSource就不需要使用BindingList来获得双向数据绑定。但我猜你所说的只有你只通过BindingSource修改列表才会这样。 - User


绑定到 IList<Person> 只会给你单向约束;对列表或列表项的更改不会反映在 DataGridView。你可以用一个 BindingList 要么 BindingSource 取而代之的是这个功能,但是你的 Person 上课仍然需要支持 INotifyPropertyChanged 或者,只有在列表中添加/删除项目时才会获得同步,而不是在列表项本身发生更改时。

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


10
2018-01-13 01:33



除非他使用的是.NET 4,否则ObservableCollection会带来更加繁重的依赖性,因为它是在WPF程序集(WindowsBase)中定义的。它只被移动到.NET 4中的System.dll。 - Josh