24

私はこの2年間、いくつかのデータベースのWinformsアプリケーションを開発しましたが、すべて正常に動作します。このアプリケーションは、レイヤー(DataAccess、ビジネスロジック、および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。
  • 私のコレクションのBindingList(Of T)に基づくコレクション。

新しいテクノロジにも興味があるので、最近WPFに関するWebキャストをいくつか見ました。これらのWebキャストでは、コレクションおよびデータバインディングサポートObservableCollection(Of T)の基本クラスとして使用されます。

一部のアプリケーションをWinformsからUIレイヤーのWPFに移行することを考えています。

私の質問は、私のビジネスロジックでは、BindingList(Of T)に基づいてコレクションを保持する方がよいのか、それともObservableCollection(Of T)から継承するように基本コレクションクラスを変更する必要があるのか​​ということです。Winformsアプリケーション、WPFアプリケーション、またはASP.NETでも使用できる、すべてのプロジェクトに固有のベースコレクションを保持したいと思います。プロジェクトでLinqtoObjectsも使用しているので、フレームワーク2.0のみに基づいてプロジェクトを維持することで制限はありません。

4

3 に答える 3

17

あなたの答えはそこにあると思います: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 リストはすべての子をリッスンして変更通知を伝達する必要があるため、メモリ負荷が増加します。

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

――ブルーノ

于 2010-11-05T13:50:26.723 に答える
12

クラベール、

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

  1. BindingList は T の IList を実装しますが、ObservableCollection は実装しません。
  2. BindingList は、データ バインディング メカニズムが新しく追加された項目をキャンセルするために使用する ICancelAddNew インターフェイスを実装します (DataGridView に行を追加した後にエスケープをクリックすると、行は消えます)。

私自身は WPF に非常に慣れていないため、ObservableCollection が提供する特定の利点がわかりません。

お役に立てれば。

于 2009-01-18T19:46:11.923 に答える