2011-08-03 49 views
48

MVVMパターンでViewViewModelについて明確な考えがあります。私は自分のアプリケーションにMVVMパターンを実装するつもりです。私はモデルに関する問題に直面している。私は解析された.xmlファイルを持っており、情報はビューに表示されます。MVVMモデルでモデルがINotifyPropertyChangedインターフェイスを実装する必要がありますか?

私は初めてモデルの変更について通知する必要があります。私は、オンデマンドで通知を受ける必要があります。

モデルの実装方法は?

私はまた、モデルクラスでINotifyPropertyChangedインタフェースを実装する必要がありますか?

+3

[MVVMではViewModelまたはModelでINotifyPropertyChangedを実装する必要がありますか?](http://stackoverflow.com/questions/772214/in-mvvm-should-the-viewmodel-or-model-implement-inotifypropertychanged) –

+0

上にリンクされた他の質問を読む価値があります。 –

答えて

3

私はあなたが何を意味するかわからないんだけど(私はそれが特定のWPFであるため、そのモデルは、INotifyPropertyChangedインタフェースを実装してはならない読んで)。 VMでは、INotifyPropertyChangedまたはDependencyProperty-esのいずれかを持つことができます(この場合、VMはDependencyObjectから派生する必要があります)。両方を持つ意味がない。それらのどれも持たないことも意味をなさない。モデルで

、あなたがやりたいことがあります。イベントを発射/受信する能力は優れていますが、必ずしもそれに頼ることはできません。基本的に、モデルはソースデータや関連するものに依存しますが、ビューモデルにはモデルとプレゼンテーションレイヤーのインタフェースが必要です。 WPFはイベントに基づいて動作するため、以上、少なくともには通知メカニズムが必要です。

12

標準MVVMのアプローチが唯一のViewModelにINotifyPropertyChangedを実装することです。目的は、ViewModelで何かが変化したときに、View上の適切なバインディングをリフレッシュすることです。

ただし、これは、ビューによってViewModel への変更を対象としています。つまり、TextBoxの値を変更すると、ViewModelのINotifyPropertyChanged実装が関連するBindingsをリフレッシュし、Viewが正しく更新されます。

データベースの変更や別のインターフェイスなど、外部ソースによってモデルに加えられた変更をカバーします。すべてのデータ変更がビューから来ている限り、ViewModelはすべての変更を認識し、更新する内容を知っている必要があります。たとえば、モデルの変数Fooを変更すると、モデルのBarの値も変更されることがわかっている場合は、Fooの値を変更すると、ViewModelのOnPropertyChanged(Foo)OnPropertyChanged(Bar)の両方を呼び出すことをおすすめします。

他の代替は、更新が必要なのViewModelにこれらの値を更新するためにモデルとビューモデルの間でイベントを使用することです。あなたが言うように、通知が「初回のみ」必要であれば、あるトリガで一度手動でリフレッシュすることも有効です。

7

モデルにINotifyPropertyChangedインターフェイスを実装させることもできます。

たとえば、モデルに可視化するプロパティが多く、そのようなモデルプロパティを公開するために、多くのコード(プロキシプロパティ)をビューモデルに実装しないようにしたい場合。MVVM、INotifyPropertyChangedでの作業中にhttp://msdn.microsoft.com/en-us/magazine/ff798279.aspx

9

ルックは、これは非常に一般的な問題であり、そうあなた溶液中の任意のWPFの特定の参照を追加する必要System.ComponentModelの一部ではないとして、WPFの特定ではありません。

モデルにINofityPropertyChangedを実装すると、ViewModel(プロキシプロパティ)でさらに多くのコードを保存できます。モデルはINotifyPropertyChangedなので受け入れられます。モデルでINotifyPropertyChangedを実装

40

は完全に許容可能である -

通常

、モデルがビューに バインドすることが簡単に機能を実装しています。これは、通常、プロパティをサポートしており、INotifyPropertyChangedINotifyCollectionChangedインターフェイスを通じて、 コレクションの変更通知をサポートすることを意味します。 オブジェクトのコレクションを表すモデルクラスは、通常 ObservableCollection<T>クラスから派生し、 INotifyCollectionChangedインターフェイスの実装を提供します。

あなたは、実装の種類をしたいかどうかを判断するためにあなたにそのアップが、

が、覚えて -

をモデルクラスが必要なインターフェイスを実装していない場合はどう?

ときには INotifyPropertyChangedINotifyCollectionChangedIDataErrorInfo、またはINotifyDataErrorInfoインタフェースを実装していないモデルのオブジェクトを操作する必要があります。そのような場合、 ビューモデルはモデルオブジェクトをラップし、ビューに必要なプロパティを表示する必要があります。これらのプロパティの値は、 がモデルオブジェクトによって直接提供されます。ビューモデルは、 が公開するプロパティに必要なインターフェイスを実装します。 ビューにデータが簡単にバインドされるようにします。撮影

- 私たちは私たちのモデルでINotifyPropertyChangedを実装し、我々は問題の多くに直面し、これに起因するものではないしているいくつかのプロジェクトに取り組んできましたhttp://msdn.microsoft.com/en-us/library/gg405484(PandP.40).aspx

。 VMでは不必要なプロパティの重複が必要でしたが、BL/DLに渡す前に基底のオブジェクトを(更新された値で)更新する必要がありました。

モデルオブジェクトのコレクション(編集可能なグリッドやリストなど)や複雑なモデルで作業する必要がある場合は、特に問題に直面します。モデルオブジェクトは自動的に更新されず、VM内のすべてのオブジェクトを管理する必要があります。

+1

http://polymod.codeplex.com/をご覧ください。あなたのモデルをPOCOとして持ち、InotifyPropertyChangedとIDataErrorInfoを提供するPolymodプロキシでラップすることができます。 Model/ViewModelに多くのコーディングを保存します。 – Arnaud

+0

ありがとうございますArnaudは、非常に便利なフレームワークのようです。 – akjoshi

+0

DTOを使用している場合はどうなりますか?INotifyPropertyChangedを使用してDTOをポーリングしますか?私はCompact Frameworkでこれを実装しているいくつかのモデルを共有しようとしましたが、これは私が探していた答えです – GorillaApe

2

これは、「純粋な」MVVMコーダーとその他の間の古典的な議論です。

ほとんどの時間が意味をなされるので、私はできる限り毎回本を読もうとします。しかし、必要に応じてコードを即興で実行する特定のシナリオでは、重複したコードが大幅に削減されます。

XMLをモデルクラスに読み込んで、モデルクラスのコピーをviewmodelに作成するか、モデルから必要なプロパティをビューモデルにコピーすることができます。このようにして、UI /モデルの更新を制御できます。最初のアプローチに従う場合は、モデルクラスにInotifypropertychangedを実装する必要があり、それは受け入れられます。

私は、ビューで表示/操作されているすべてのプロパティを正確に制御できるので、私は第2のアプローチに従うことを最優先に考えています。また、私はMVVMのパターンを破っていないと感じるでしょう。

関連する問題