回答:
あ ObservableCollection
まさにすべてのコレクションのようなUIから更新することができます。真の違いはかなり単純です。
ObservableCollection<T>
INotifyCollectionChanged
コレクションが変更されたときに通知を提供する実装(あなたは^^を推測しました)を更新すると、バインディングエンジンはUIを更新できますObservableCollection
。
ただし、をBindingList<T>
実装しIBindingList
ます。
IBindingList
コレクションの変更に関する通知を提供しますが、それだけではありません。次のような変更に応じてUIを更新するだけではなく、UIで使用できる機能をすべて提供します。
これらの機能はすべて、 ObservableCollection<T>
もう1つの違いはBindingList
、アイテムの実装時にアイテム変更通知を中継することINotifyPropertyChanged
です。項目が提起した場合PropertyChanged
、イベントを、BindingList
発生させ、それを受信するListChangedEvent
とListChangedType.ItemChanged
とOldIndex=NewIndex
(アイテムが交換された場合、OldIndex=-1
)。ObservableCollection
アイテム通知を中継しません。
Silverlightでは、BindingList
はオプションとして使用できないことに注意してください。ただし、ObservableCollection
sとICollectionView
(IPagedCollectionView
私がよく覚えている場合)を使用できます。
BindingList
時代遅れ?
実際の違いは、BindingListがWinForms用であり、ObservableCollectionがWPF用であることです。
WPFの観点から見ると、BindingListは適切にサポートされておらず、本当に必要な場合を除いて、WPFプロジェクトで実際に使用することは決してありません。
含まれている要素に関する機能や変更通知などの最も重要な違いは、受け入れられた回答で既に言及されていますが、他にも言及する価値があるものがあります。
パフォーマンス
ときはAddNew
、呼び出されたBindingList<T>
ことにより、追加したアイテムを検索IndexOf
検索。変更された要素のインデックスをT
実装してINotifyPropertyChanged
いる場合も検索されますIndexOf
(ただし、同じアイテムが繰り返し変更される限り、新しいルックアップはありません)。コレクションに何千もの要素を格納する場合、ObservableCollection<T>
(またはIBindingList
O(1)ルックアップコストを使用したカスタム実装)の方が望ましい場合があります。
完全
IBindingList
インタフェースは、巨大な1(そうでないかもしれないクリーンなデザイン)で、実装者は、その機能のサブセットのみを実装することができます。例えばAllowNew
、SupportsSorting
及びSupportsSearching
特性がかどうかを伝えAddNew
、ApplySort
及びFind
方法は、それぞれ、使用することができます。それBindingList<T>
自体が並べ替えをサポートしていないことは、しばしば人々を驚かせます。実際には、派生クラスに不足している機能を追加させる仮想メソッドがいくつか提供されています。DataView
クラスは、完全のための例示であり、IBindingList
実装。ただし、そもそも型付きコレクション用ではありません。また、BindingSource
WinForms のクラスはハイブリッドの例ですIBindingList
。並べ替えをサポートする別の実装をラップする場合は、並べ替えをサポートします。
ObservableCollection<T>
INotifyCollectionChanged
インターフェースの完全な実装です(単一のイベントのみ)。また、仮想メンバーもありますが、ObservableCollection<T>
通常はその基本Collection<T>
クラスと同じ理由で派生します。バインディング機能を調整するのではなく、アイテムの追加/削除(たとえば、データモデルコレクション内)をカスタマイズするためです。
コピーとラッピング
両方ObservableCollection<T>
とBindingList<T>
既存のリストを受け取るコンストラクタを持っています。ただし、別のコレクションによってインスタンス化された場合、動作は異なります。
BindingList<T>
提供されたリストの監視可能なラッパーとして機能し、変更はBindingList<T>
は、基になるコレクションにも反映されます。ObservableCollection<T>
一方、新しいList<T>
インスタンスを基本Collection<T>
コンストラクターに渡し、元のコレクションの要素をこの新しいリストにコピーします。もちろん、T
参照タイプの場合、要素の変更は元のコレクションから表示されますが、コレクション自体は更新されません。ワン・モア大きな違いの間ObservableCollection
とBindingList
便利な付属しており、トピックに関する入札の決定要因となることができます。
BindingList
リスト変更ハンドラー:
ObservableCollection
コレクションの変更:
上記の概要:でアイテムのプロパティが変更された
BindingList
場合、ListChanged
イベントは(PropertyDescriptor内の)プロパティの完全な詳細をObservableCollection
提供し、それを提供しません。実際ObservableCollection
、アイテムで変更されたプロパティの変更イベントは発生しません。
上記の結論は、INotifyPropertyChanged
モデルクラスでの実装に関するものです。デフォルトでは、項目でプロパティが変更された場合、noneはchangedイベントを発生させません。