2017-02-26 18 views
0

私はモデルを表すWPFクライアントにMVVMを使用しており、ユーザーはそのモデルとやりとりすることができます。私はいつも実際のモデルでObservableCollectionクラスを使用しないようにしました。そのモデルの中のIListのようなジェネリックコレクションを選択し、そのIListを基になるコレクションが変更されたときにViewModel上の実際のデータバインドObservableCollectionに変換します。あなたがIEnumerableを インタフェースを実装するすべてのコレクションを列挙できMVVMのモデルでObservableCollectionsを使用する必要がありますか?

:MSDNは、WPFとUIを中心としてクラスを提示していることであることの理由。ただし、コレクションの挿入または の削除によってUIが自動的に更新されるように動的バインディングを設定するには、 コレクションでINotifyCollectionChangedインターフェイスを実装する必要があります。この インターフェイスは、CollectionChangedイベントを公開します。イベントは、基になるコレクションが変更されるたびに になるはずです。 WPFは ObservableCollectionクラスを提供します。これは、 データコレクションの組み込みの実装であり、INotifyCollectionChanged インターフェイスを実装しています。

質問:私の区別は実際には必要ですか?余分な作業と余分なコードです。私はこの話題があまりにも曖昧で主観的であるかもしれないことを理解していますが、多分誰もが従う、普遍的に合意された明確な条約があります。

答えて

4

はい私はあなたが正しいことをしていると思います。観察可能なコレクションはプレゼンテーション層に属します。ドメインモデルではなくビューモデルに追加します。

This question may be of some help

が、おそらく誰もが次の明確な、普遍的に合意された規則があります。

あなたがそれらを見つけたら教えてください。

+1

これは、あなたが絶対にnoと言うことができない状況の1つですが、MVVMのモデルでObservableCollectionが見える場合はかなり強い "コードの匂い"です。 –

2

私の区別は実際には必要ですか?

このケースでは、実際にモデルが何であるか、またはモデルをどのように定義するかによって異なります。

ビジネスまたはサービスレイヤーによって参照され、ドメイン全体で使用されるアセンブリで定義されている、ある種のドメインビジネスオブジェクトの場合、そのようなクライアント固有のインターフェイスは実装しないでください。 INotifyCollectionChangedとなります。

次に、IListのようなジェネリック型を使用して、クライアントアプリケーションでビュー要素にバインドするラッパークラスを作成することをお勧めします。

ただし、モデルがクライアントアプリケーション内でのみ使用され、アプリケーションの他の層では使用されないクラスの場合は、コレクションプロパティをObservableCollectionとして定義し、直接このプロパティにバインドすることもできます。

重要な点は、ドメインビジネスオブジェクトは、WPFやクライアントアプリケーションがバインドできるという知識がないことです。そのため、WPF対応のビューモデルクラスで最初にラップすることなく、WPFアプリケーション内のそのようなオブジェクトに直接バインドすることはほとんどありません。

これはいくつかの余分な作業と追加のクラスを追加しますが、同時に保守のためによくある懸念の分離を維持するのに役立ちます。

エンタープライズのシナリオでは、ビジネスオブジェクトにクライアントに公開したくないビジネスロジックが含まれている可能性もあります。また、ビューに公開する意味がない追加のプロパティも含まれる場合があります。したがって、コレクションプロパティが実際にObservableCollectionを返す必要がある場合でも、それを別のクラスにラップする必要があります。

あなたの質問が「ビジネスオブジェクトでObservableCollectionsを使用する必要がある」と答えた場合、答えは「いいえ」です。

関連する問題