2011-10-17 8 views
2

私はMVVMを初めて使用し、SilverlightプロジェクトでMVVMリファクタリングを行っています。MVVM、モデルまたはビューモデル(コントローラ)にロジックを配置する必要があります

ビューはブックリストで、ブックのタイトルをViewModelにバインドします。 ViewModelにpublic string Title { get; set; }、さらにpublic string Title { get; set; }がモデルにあります。

ViewModelまたはModelにイベントハンドラを置く必要がある場合は、イベントハンドラを挿入してブックタイトルを更新しますか?どのモデルが使用されていますか?

答えて

1

簡単に言えば、モデルは、本物の基礎となるデータモデルであり、データベースからデータを取得して設定できる、アプリケーションによって必要とされるブックリストに関するすべての情報を含んでいます。

ViewModelは、主にビューのデータバインディングを提供するために存在するオブジェクトです。これはモデルのサブセットでも、複数のモデルのプロパティを単一のオブジェクトに組み合わせてもかまいません。ビューにジョブを実行させるために必要かつ十分なプロパティが含まれている必要があります。

イベントハンドラがビューに関連する場合は、ViewModelに属します。目的に合ったコマンドパターン(Custom WPF command pattern exampleを参照)を試してみてください。

7

私の意見では "いずれも" ...コントローラークラスをMVVMのミックスに追加します。

ビューモデルにコントローラコードを置くことの問題は、独立してテストするのが難しくなることです。多くの点で、私はこれをコードの背後にある悪いものとみなしています。

MVVMにはコントローラがないものとみなされています.CM MVVMはMVCのバリエーションです(ViewModelsを追加するだけです)。

代わりにMVCVMと呼ばれているはずですか?

ViewModelsは、ビューから「GUI」コードをオフロードし、バインディングのためのデータを格納するためだけにあります。 ViewModelは処理を行うべきではありません。良いテストは、あなたのViewModelが自動ユニットテストによってテスト可能であり、データソースなどに依存しないことです。データが実際にどこから来ているのか(または誰がそれを表示しているのか)分かりません。

見落とすことも回避することもできますが、コントローラは表示するデータモデルとビューを決定する責任があります。 ViewModelは、モデル(MVVMのM)とビューの間のブリッジです。これにより、より簡単な「分離された」XAMLオーサリングが可能になります。

最近のすべてのプロジェクトで正常に使用しているパターンは、コントローラーをモジュールに登録し、起動時に初期化することです。コントローラーは非常に軽くてスリムで、メッセージを聞いたり、送信したりするアプリの寿命の間にハングアップする必要があるのは唯一のものです。初期化メソッドでは、必要なもの(ビューやビューモデルなど)を登録します。この軽量のロジックオンリーメモリのパターンは、よりスリムなアプリケーションにもなります(WP7の方が優れています)。我々は従う

基本的なルールは以下のとおりです。

  • コントローラは を傍受する
  • コントローラは、ビューモデルのICommandのプロパティを設定
  • コントローラデータを取得し、適切なビューモデルのプロパティに配置するイベントに基づいて決定を下しますイベント
  • コントローラはビ​​ューを表示します(他に暗示しない場合)
  • ビューモデルは「ダム」です。彼らは、結合のためのデータを保持し、他には何
  • ビューは、彼らがデータの特定の形状を表示する知っているが、最後の2つのポイントは、あなたが壊れることはありませんものかを分離している

からそれが来ないアイデア を持っていません心配は窓から出る。

+0

ViewModelにイベント処理やロジックを配置するかどうかについては議論ができますが、今はModel for専用のものが欲しいですか?それは論理権利を持ってはいけませんか? – demaxSH

+0

モデルにはビジネスデータが格納されています(ビジネスロジックはよくありますが、UIやアプリケーションロジックは使用されません)。それが消費される方法をモデルは決して知るべきではありません。 –

関連する問題