2

ドメインモデルコレクションクラスと、ドメインモデルの要素を反映して投影するだけのビューモデルクラスが必要ですが、それ自体は読み取り専用です。

ここでの私の考えは、両方のタイプがINotifyCollectionChangedインターフェイスを実装し、ビューモデルタイプが、モデル要素を要素ビューモデルタイプにラップするプロキシおよびプロジェクターとして機能することです。

問題は、INotifyCollectionChangedを実装することで、たとえばDataGridやListViewへのWPFデータバインディングを有効にするのに十分ですか、それともコレクションベースのデータバインディングを有効にするために必要なインターフェイスの最小セットは何ですか?

4

1 に答える 1

4

INotifyCollectionChangedコレクション内の要素内のプロパティが変更された場合、要素全体がコレクションに追加または削除された場合にのみ、UIは更新されません。

したがって、要素全体の変更を追跡するだけで十分であれば、それ以上の粒度で十分であり、プロパティセッター内INotifyCollectionChangedに実装する必要があります。INotifyPropertyChanged

注目に値するもう1つのポイントはObservableCollection、リストを格納するためにを使用する場合、これはすでに実装されているというINotifiyCollectionChangedことです。

編集:

以下はマイクロソフトの見解です。

インターフェイスを実装する任意のコレクションを列挙できIEnumerable ます。ただし、コレクションでの挿入または削除によってUIが自動的に更新されるように動的バインディングを設定するには、コレクションでINotifyCollectionChangedインターフェイスを実装する必要があります。このインターフェイスは、基になるコレクションが変更されるたびに発生する必要があるイベントを公開します。

WPFは、インターフェイスObservableCollection(Of T)を公開するデータコレクションの組み込み実装で​​あるクラスを 提供しINotifyCollectionChangedます。

ソースオブジェクトからターゲットへのデータ値の転送を完全にサポートするには、バインド可能なプロパティをサポートするコレクション内の各オブジェクトもINotifyPropertyChangedインターフェイスを実装する必要があることに注意してください。

独自のコレクションを実装する前に、、、、などの既存のコレクションクラスのいずれかを使用することを検討し てObservableCollection(Of T)ください。高度なシナリオがあり、独自のコレクションを実装する場合は、を使用することを検討してください。これにより、インデックスによって個別にアクセスできる非ジェネリックなオブジェクトのコレクションが提供され、最高のパフォーマンスが得られます。List(Of T)Collection(Of T)BindingList(Of T)IList

から..

http://msdn.microsoft.com/en-us/library/ms752347.aspx#binding_to_collections

于 2013-03-06T23:54:16.977 に答える