List <T>とBindingList <T>の長所/短所


91

この2つの違いが私のプロジェクトにとって何であるかを誰かが説明できますか?

現在、私はList<MyClass>BindingSourceをそれに設定し、DataGridViewをBindingSourceに設定しています。

IEditableObjectCancelEditが呼び出されたときにオブジェクトを元の状態に戻すように実装しました。Memberwise.Clone()

リストをBindingListに変更すると、これは解決されますか?BindingListを使用する利点は何ですか?

回答:


123

A List<>は、特定のタイプのアイテムの、自動的にサイズ変更される配列であり、いくつかのヘルパー関数(例:ソート)を備えています。これは単なるデータであり、モデル内のオブジェクトのセットに対して操作を実行するために使用する可能性があります。

A BindingList<>は、型付きリストまたはコレクションのラッパーであり、IBindingListインターフェースを実装します。これは、双方向データバインディングをサポートする標準インターフェースの1つです。これListChangedは、アイテムを追加、削除、または設定したときに発生するイベントを実装することによって機能します。バインドされたコントロールは、いつ表示を更新するかを知るために、このイベントをリッスンします。

BindingSourceのDataSourceをに設定するとList<>、内部的にが作成さBindingList<>れ、リストがラップされます。BindingList<>BindingSourceの外部でアクセスしたい場合は、リストを自分で事前にラップすることもできますが、それ以外はまったく同じです。から継承しBindingList<>て、アイテムを変更するときに特別な動作を実装することもできます。

IEditableObjectBindingSourceによって処理されます。バインドされたコントロールのデータを変更すると、実装オブジェクトのBeginEditが呼び出されます。次に、BindingSourceでEndEdit / CancelEditを呼び出すと、オブジェクトに渡されます。別の行に移動すると、EndEditも呼び出されます。


現在、List <T>アプローチでは、CancelEditを呼び出しても、編集中のアイテムは元の状態に戻らないため、Clone()を使用するのはなぜですか。バインディングリストが私のためにそれを処理すると言っていますか?
Jon

3
いいえ、BindingListはその機能とは関係ありません。BindingSourceは、基になるリストの種類に関係なく、現在のオブジェクトでCancelEditを呼び出すだけです。フレームワークには、プレーンオブジェクトのバージョン管理を自動的に実装するものはありません。この目的のためだけにデータの元のコピーを保持するDataTables / DataRowsを使用できます。
Alex J

リストが変更されたときにコントロールが知る必要があるとあなたは言いました、あなたはさらに説明できますか?datagridviewのあるフォームと、データが入力されたフォームの別のフォームがあります。この件に関してあなたが何を言っているかについて、私は心配する必要がありますか?
Jon

たとえば、DataGridは、新しい行を追加するためにアイテムがリストに追加された時期を知る必要があります。そのため、BindingListのListChangedイベントを使用します。グリッドをList <T>に直接バインドしている場合、イベントは発生せず、グリッドはリストをいつ変更したかを知ることができません。BindingSourceは、List <T>をBindingListでラップするため、シナリオで心配する必要はありません。リスト自体ではなくBindingSourceを使用している限り、コントロールは同期したままになります。
Alex J

BindingList to WPF UI(mvvm方法)を使用する回避策はありますか?bindinglistを監視可能なコレクションにラップできますか?
ランス

12

BindingListは、イベントを使用して双方向のデータバインディングを可能にします。Listは、コレクションが変更されてもイベントを発生させません。

それはあなたの特定の問題を解決するとは思いません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.