このような簡単な例では、この回答は「はい」(不当に重複しています)です。しかし、おそらく、ページには単一のModelオブジェクトだけではないものが含まれています。あなたはページ状態と、すべて追跡されなければならない複数の他のModelオブジェクトを持つかもしれません。これはViewModelで行われます。
たとえば、ステータスバーに表示されるログインユーザーに関する追加情報や、テキストファイルの変更を検出するために実行されるサービスなどがあります。
また、Studentオブジェクトを編集するためのフォームがある場合もあります。これらの変更を検証する場合は、変更が検証されるまでStudentオブジェクトを直接編集する必要はありません。このような場合、ViewModelは一時的な格納場所として機能できます。
上記の注:モデルで検証が行われるのは珍しいことではありませんが、ユーザーがフォームの編集中に無効な値を入力できるようにすることもできます。たとえば、モデルでフィールドの長さゼロの値を許可しない場合でも、ユーザーが値を削除したり、別のフィールドに移動したり(たとえば、コピーするなど)、フィールドに戻り、編集(貼り付け)を完了します。モデルに直接結ばれている場合、検証ロジックは、この「中間」、「未完了」の状態を望みどおりに処理しないことがあります。たとえば、ユーザーが入力を完了して[保存]をクリックするまで、検証エラーを表示したくない場合があります。
また、ボタンのクリックなどを処理するために、ViewModelにCommandオブジェクトがあるとします。これらは、モデルでは役に立たないドメイン固有のオブジェクトです。
ViewModelsは、モデルオブジェクトをフィルタリングしたり、一時的に「変更」して画面上で有用なものを得る必要がある場合にも便利です。たとえば、システム内のすべてのユーザーのリストを、上位10人のパフォーマーの中のリアルタイムのリスト(10秒ごとに更新)と共に表示したい場合があります。または、レポートのリストと、全体的な使用率などを示すグラフを表示することもできます。そのデータのフィルタリング、並べ替え、およびカスタマイズは、ViewModel内で行われます。
一方、モデルは通常、できるだけ純粋です。理想的には、永続的なストレージ(データベース、または何を持っているか)に正確にモデルする(通常は)POCOsだけを欲しいとします。永続ストレージにFirstNameフィールドとLastNameフィールドがある場合は、モデルも同様です。 ViewModelでのみ、それらを結合してNameフィールド(ビューのニーズに応じて、「First Last」または「Last、First」のいずれか)を取得します。例えば
:MVVMで
namespace Model
{
public class Student
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Class
{
public string Name { get; set; }
public float Score { get; set; }
}
}
namespace ViewModel
{
public class EditStudentRecordViewModel
{
private Model.Student _student;
private IEnumerable<Model.Class> _studentClasses;
/* Bind your View to these fields: */
public string FullName
{
return _student.LastName + ", " + _student.FirstName;
}
public string FirstName { get; set; }
public string LastName { get; set; }
public IEnumerable<Model.Class> PassingClasses
{
get
{
return _studentClasses.Where(c => c.Score >= 78);
}
}
public IEnumerable<Model.Class> FailingClasses
{
get
{
return _studentClasses.Where(c => c.Score < 78);
}
}
public void Save()
{
List<string> l_validationErrors = new List<string>();
if (string.IsNullOrEmpty(this.FirstName))
l_validationErrors.Add("First Name must not be empty.");
if (string.IsNullOrEmpty(this.LastName))
l_validationErrors.Add("Last Name must not be empty.");
if (l_validationErrors.Any())
return;
_student.FirstName = this.FirstName;
_student.LastName = this.LastName;
Model.Utilities.SaveStudent(_student);
}
}
}
出典
2013-01-09 13:52:57
JDB
非常によく質問を置く、方法:明快で簡潔で、サンプルコードが含まれています。 – JDB