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

Use*_*ser 11 c# datagridview bindinglist bindingsource winforms

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

//pseudo code
BindingSource.DataSource = IBindingList<Person>
Run Code Online (Sandbox Code Playgroud)

或者我可以这样做:

BindingSource.DataSource = IList<Person>
Run Code Online (Sandbox Code Playgroud)

有什么不同?如果我的列表更改将以DataGridView任何方式更新?如果我必须使用BindingList它,似乎有点不稳定(因为创建一个依赖)BindingList从我的服务层返回一个,有没有办法解决这个问题?

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

"但是,典型的解决方案程序员将使用提供数据绑定功能的类,例如BindingSource,而不是直接使用BindingList<T>."

Bra*_*ith 11

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

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

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

Jos*_*osh 5

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

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