2011-01-13 54 views
10

我想在Windows窗體應用程序中顯示DataGridView中的人員列表。我希望我的服務層返回一個Person對象列表(例如,IList<Person>)。我希望列表中的更改反映在DataGridView之間,反之亦然。我的理解是,使用BindingSource有助於與DataGridView一起工作。我的問題是對於數據綁定雙向工作,我需要:我是否需要BindingSource和BindingList for WinForms DataBinding?

//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>「。

回答

3

如果您使用BindingList<T>,則通過基礎列表進行的更改將反映在數據綁定控件中,因爲BindingList在列表更改時引發事件。大多數其他收藏不。

如果使用正常集合作爲數據源隨後改變您使通過綁定控件(或通過的BindingSource)將仍然可以被反射其他數據,但改變底層集合直接不會。

+0

部分原因是,有些人似乎認爲你並不需要使用的BindingList獲得雙向綁定,只要你使用的是BindingSource的。但我想你所說的只有通過BindingSource修改列表纔是真實的。 – User 2011-01-13 14:48:51

10

綁定到IList<Person>只會給你單向綁定;對列表或列表項的更改將不會反映在DataGridView中。您可以使用BindingListBindingSource獲得這個功能,而不是,但你的Person類將仍然需要支持INotifyPropertyChanged否則當項目被添加/刪除/從列表中,而不是在列表項本身改變你只會得到同步。

如果您想避免依賴於System.Windows.Forms,您可以使用ObservableCollection<Person>代替;這支持必要的更改通知,因此可以用作雙向綁定源。我的困惑

+6

除非他使用.NET 4,否則ObservableCollection會帶來更加繁重的依賴性,因爲它是在WPF程序集(WindowsBase)中定義的。它只在.NET 4中移動到System.dll。 – Josh 2011-01-13 01:36:44

相關問題