23


6

ObservableCollection(Of T)とBindingList(Of T)の関係

私はこの2年間、いくつかのデータベース・ベースのWinformsアプリケーションを開発しましたが、すべてうまくいきました。 このアプリケーションは、レイヤ(データアクセス、ビジネスロジック、およびUI)上に構築されています。 ビジネスロジックでは、私のすべてのオブジェクトは、次の定義を持つBaseEntityという基本クラスから継承します(フレームワーク要素と組み合わせたカスタムオブジェクトとインターフェイスがいくつかあります)。

_ _

Public MustInherit Class BaseEntity
    Inherits SerializableObject
    Implements IEntity
    Implements IComparer,  _
               IEditableObject,  _
               INotifyPropertyChanging, INotifyPropertyChanged,  _
               IApplicationSecurity
  End Class

_ _

同じコアライブラリで、私はジェネリックベースコレクションBaseEntityCollectionを持っています。 これらのコレクションにより、オブジェクトごとに、関連する強く型付けされたコレクションをデータベースのアプリケーションで定義することができます。 これが基本定義です。

 Public MustInherit Class BaseEntityCollection(Of T As BaseEntity)
    Inherits BindingList(Of T)
    Implements IEntityCollection
    Implements INotifyPropertyChanged, INotifyPropertyChanging, ICopyable(Of T)
    Implements IDisposable
    Implements ISerializable
  End Class

お分かりのように、私はWinformsの正しいデータバインディングに必要なものをすべて使います。

  • INotifyPropertyChanged、INotifyPropertyChanging、IEditableObject for オブジェクト。

  • 私のコレクションのBindingList(Of T)に基づくコレクション。

私はまた新しい技術にも興味を持っています、それで私は最近WPFについてのあるウェブキャストを見ました。 これらのWebキャストでは、ObservableCollection(Of T)をサポートしています。

私は自分のアプリケーションのいくつかをWinformsからUIレイヤのWPFに移行することを考えています。

私の質問は、私のビジネスロジックのためには、私のコレクションをBindingList(Of T)に基づいたほうがよいか、それともObservableCollection(Of T)から継承するように私の基本コレクションクラスを変更すべきかです。 私は私のすべてのプロジェクトのためのユニークな基本コレクションを保ちたいと思います。それはWinformsアプリケーション、WPFアプリケーションまたはASP.NETでも使用できます。 私は自分のプロジェクトでもLinq to Objectsを使用しているので、自分のプロジェクトをフレームワーク2.0だけに基づいて管理するという制限はありません。

ありがとう、

ClaBer

3 回答


15


私はあなたの答えがそこにあると思います:http://xceed.com/CS/blogs/dontpanic/archive/2009/04/01/i-notify-we-notify-we-all-wait-no-we-don- t.aspx

要するに、ObservableCollectionはその子の変更をリスンするのではなく、InsertイベントとRemoveイベントだけをリスンします。

その一方で、BindingListは、その子によって発生した変更や更新を監視しません。 しかし、Bindingリストは変更通知を伝播するためにそのすべての子を監視しなければならないため、メモリの負荷が増えます。

これが役立つことを願っています:)

  • ブルーノ


13


クラバー、

BindingListはObservableCollectionよりも多くのインターフェイスとより豊富な機能をサポートしているため、私はBindingListをそのまま使用します。 例えば:

  1. BindingListはTのIListを実装しますが、ObservableCollectionは実装しません。

  2. BindingListは、新しく追加された項目をキャンセルするためにデータバインディングメカニズムが使用するICancelAddNewインターフェイスを実装します(DataGridViewに行を追加した後で[escape]をクリックすると、その行は表示されなくなります)。

私は自分自身がWPFには初めてなので、ObservableCollectionが提供する特定の利点を知りません。

お役に立てれば。


2


私の2セントを古いトピックに追加します。

これらの汎用コレクションのいずれかをWinForms DataGridViewにデータバインドしてから、選択した複数の行のソースデータのプロパティを更新すると、次のようになります。

  1. `ObservableCollection`は、セルの値のみを更新します 最後に選択された行。

  2. `BindingList`は選択されたすべてのセル値を更新します 行

私は彼らにはそれぞれ長所と短所があると思いますが、上記の例はそれに気付いていない人にとっては当たり前のことです。