web-dev-qa-db-ja.com

ObservableCollectionとBindingListの違い

ObservableCollectionBindingListの違いを知りたいのは、Sourceでの追加/削除の変更を通知するために両方を使用したためですが、実際にどちらを優先するかはわかりません。

なぜ次のいずれかを選択するのですか?

ObservableCollection<Employee> lstEmp = new ObservableCollection<Employee>();

または

BindingList<Employee> lstEmp = new BindingList<Employee>();
227
Azhar

ObservableCollectionは、コレクションとまったく同じようにUIから更新できます。本当の違いはかなり簡単です:

ObservableCollection<T>は、コレクションが変更されたときに通知を提供するINotifyCollectionChangedを実装します(^^)ObservableCollectionが更新されると、バインディングエンジンがUIを更新できます。

ただし、BindingList<T>IBindingListを実装します。

IBindingListはコレクションの変更に関する通知を提供しますが、それだけではありません。 UIが使用できる機能の全体を提供し、変更に応じたUIの更新だけでなく、次のような多くの機能を提供します。

  • 仕分け
  • 検索中
  • ファクトリを介して追加(AddNewメンバー関数)。
  • 読み取り専用リスト(CanEditプロパティ)

これらの機能はすべてObservableCollection<T>で使用できません

もう1つの違いは、BindingListは、アイテムがINotifyPropertyChangedを実装するときにアイテム変更通知を中継することです。アイテムがPropertyChangedイベントを発生させた場合、BindingListはそれを受け取り、ListChangedType.ItemChangedおよびOldIndex=NewIndexListChangedEventを発生させます(アイテムが置き換えられた場合、OldIndex=-1)。 ObservableCollectionはアイテム通知を中継しません。

Silverlightでは、BindingListはオプションとして使用できません。ただし、ObservableCollectionsおよびICollectionView(覚えている場合はIPagedCollectionView)を使用できます。

271
Eilistraee

実際の違いは、BindingListはWinForms用であり、ObservableCollectionはWPF用です。

WPFの観点から見ると、BindingListは適切にサポートされておらず、本当に必要な場合を除き、WPFプロジェクトで実際に使用することはありません。

21
Dean Chalk

もう1つObservableCollectionBindingListの大きな違いは便利で、トピックの入札決定要因になります。

BindingListリスト変更ハンドラー:

BindingList List Change

ObservableCollectionコレクションの変更:

ObervableCollection Collection Changed

上記の簡単な説明:BindingListでアイテムのプロパティが変更された場合、ListChangedイベントにより、 property(PropertyDescriptor)およびObservableCollectionはそれを提供しません。実際、ObservableCollectionは、アイテムで変更されたプロパティの変更イベントを発生させません。

上記の結論は、モデルクラスに実装されるINotifyPropertyChangedに関するものです。デフォルトでは、アイテムのプロパティが変更された場合、changedイベントは発生しません。

1
Kylo Ren

含まれる要素に関する機能や変更通知などの最も重要な違いは、受け入れられた回答ですでに言及されていますが、言及する価値のあるものもあります。

パフォーマンス

AddNewが呼び出されると、BindingList<T>IndexOfルックアップによって追加されたアイテムを検索します。 TINotifyPropertyChangedを実装している場合、変更された要素のインデックスもIndexOfによって検索されます(同じアイテムが繰り返し変更される限り、新しいルックアップはありません)。コレクションに数千の要素を格納する場合、ObservableCollection<T>(またはO(1)ルックアップコストを使用したカスタムIBindingList実装)がより望ましい場合があります。

完全性

  • IBindingListインターフェイスは巨大なインターフェイスで(おそらく最もクリーンなデザインではありません)、実装者がその機能のサブセットのみを実装できるようにします。たとえば、AllowNewSupportsSorting、およびSupportsSearchingプロパティは、AddNewApplySort、およびFindメソッドをそれぞれ使用できるかどうかを示します。 BindingList<T>自体がソートをサポートしていないことは、多くの場合人々を驚かせます。実際には、派生クラスに欠落している機能を追加させる仮想メソッドがいくつか用意されています。 DataViewクラスは、完全なIBindingList実装の例です。ただし、そもそも型付きコレクション用ではありません。また、WinFormsのBindingSourceクラスはハイブリッドの例です。ソートをサポートする別のIBindingList実装をラップする場合、ソートをサポートします。

  • ObservableCollection<T>は既にINotifyCollectionChangedインターフェイスの完全な実装です(単一のイベントのみがあります)。また、仮想メンバーもありますが、ObservableCollection<T>は通常、その基本Collection<T>クラスと同じ理由で派生します。バインディング機能を調整するのではなく、アイテムの追加/削除(データモデルコレクションなど)をカスタマイズします。

コピーとラッピング

ObservableCollection<T>BindingList<T>の両方には、既存のリストを受け入れるコンストラクターがあります。別のコレクションによってインスタンス化された場合、それらは異なる動作をしますが:

  • BindingList<T>は、提供されたリストのオブザーバブルwrapperとして機能し、BindingList<T>で実行された変更は、基礎となるものに反映されますコレクションも。
  • 一方、ObservableCollection<T>は新しいList<T>インスタンスをベースCollection<T>コンストラクターに渡し、元のコレクションの要素をこの新しいリストにコピーします。もちろん、Tが参照型の場合、要素の変更は元のコレクションから表示されますが、コレクション自体は更新されません。
1
György Kőszeg