12

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

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

或者我可以这样做:

BindingSource.DataSource = IList<Person>

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

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

“然而,典型的解决方案程序员会使用提供数据绑定功能的类,例如BindingSource,而不是直接使用BindingList<T>。”

4

2 回答 2

11

绑定到 anIList<Person>只会给你单向绑定;对列表或列表项的更改不会反映在DataGridView. 您可以使用BindingListorBindingSource来获取此功能,但您的Person课程仍需要支持INotifyPropertyChanged,否则您将仅在列表中添加/删除项目时获得同步,而不是列表项目本身更改时。

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

于 2011-01-13T01:33:23.737 回答
3

如果使用BindingList<T>,则通过基础列表所做的更改将反映在数据绑定控件中,因为 BindingList 在列表更改时引发事件。大多数其他系列没有。

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

于 2011-01-13T01:31:14.667 回答