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

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

 //pseudo code BindingSource.DataSource = IBindingList 

或者我可以这样做:

 BindingSource.DataSource = IList 

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

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

“但是,典型的解决方案程序员将使用提供数据绑定function的类,例如BindingSource ,而不是直接使用BindingList 。”

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

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

绑定到IList只会给你单向绑定; 对列表或列表项的更改不会反映在DataGridView 。 您可以使用BindingListBindingSource来获取此function,但您的Person类仍然需要支持INotifyPropertyChanged ,否则只有在列表中添加/删除项目时才会获得同步,而不是在列表项本身发生更改时。

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