我想在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<T>
。“
答案 0 :(得分:11)
绑定到IList<Person>
只会给你单向绑定;对列表或列表项的更改不会反映在DataGridView
中。您可以使用BindingList
或BindingSource
代替此功能,但您的Person
课程仍然需要支持INotifyPropertyChanged
,否则您只会在添加项目时获得同步/从列表中删除/,而不是列表项本身更改。
如果您想避免依赖System.Windows.Forms
,可以改用ObservableCollection<Person>
;这支持必要的更改通知,因此可以用作双向绑定源。
答案 1 :(得分:3)
如果使用BindingList<T>
,则通过基础列表进行的更改将反映在数据绑定控件中,因为BindingList会在更改列表时引发事件。大多数其他系列没有。
如果使用普通集合作为数据源,则仍会反映通过其他数据绑定控件(或通过BindingSource)所做的更改,但不会直接更改基础集合。