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

时间:2011-01-13 01:17:47

标签: c# winforms datagridview bindingsource bindinglist

我想在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>。“

2 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:3)

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

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