2011-01-13 16 views
10

WindowsフォームアプリケーションでDataGridViewに人のリストを表示したいとします。サービスレイヤーからPersonオブジェクトのリスト(たとえば、IList<Person>)を返すようにします。私はリストの変更をDataGridViewに反映させ、その逆も欲しい。私の理解では、BindingSourceを使用すると、DataGridViewでの作業が容易になります。双方向のデータバインディングが機能するために私の質問は、私は必要なのですか、次のとおりです。WinForms DataBindingにBindingSourceとBindingListが必要ですか?

//pseudo code 
BindingSource.DataSource = IBindingList<Person> 

または私が行うことができます。

BindingSource.DataSource = IList<Person> 

違いは何ですか?私のメイクがリストに変更された場合、DataGridViewはどちらかの方法で更新されますか? BindingListを使用する必要がある場合は、私のサービスレイヤーからBindingListを返すために少し依存しているようです(依存関係を作成しているため)。

Microsoftが(備考セクション)BindingList http://msdn.microsoft.com/en-us/library/ms132679.aspxでこう述べています。

「しかし、典型的な解決策 プログラマは などBindingSourceとして、 は、データバインディング機能を提供しているクラスを使用しますが、代わりに BindingList<T>を直接使用してください。

答えて

3

BindingList<T>を使用すると、BindingListはリストが変更されたときにイベントを発生させるため、基になるリストを変更するとデータバインドコントロールに反映されます。他のほとんどのコレクションはそうではありません。

通常のコレクションをデータソースとして使用すると、他のデータバインドコントロール(またはBindingSource)を使用して行った変更は反映されますが、基になるコレクションの変更は直接反映されません。

+0

私の混乱の一部は、BindingSourceを使用している限り、双方向データバインディングを取得するためにBindingListを使用する必要がないと示唆しているようでした。しかし、BindingSourceを使ってリストを変更するだけであれば、あなたが言っていることは間違いないと思います。 – User

10

へのバインドIList<Person>へのバインドは、一方向バインディングのみを提供します。リストまたはリスト項目の変更はDataGridViewに反映されません。 BindingListまたはBindingSourceを使用してこの機能を使用することもできますが、Personクラスは依然としてINotifyPropertyChangedをサポートする必要があります。そうしないと、アイテムがリストに追加/削除されたときにのみ取得されます。

System.Windows.Formsへの依存を避けたい場合は、代わりにObservableCollection<Person>を使用できます。これは必要な変更通知をサポートしているため、双方向バインディングソースとして使用できます。

+6

.NET 4を使用していない限り、ObservableCollectionはWPFアセンブリ(WindowsBase)で定義されているため、さらに厄介な依存関係を持ちます。 .NET 4のSystem.dllにのみ移動されました。 – Josh

関連する問題