在这样一个简单的例子中,这个答案是肯定的(这是不合理的冗余)。但是,据推测,一个页面将包含的不仅仅是一个单一的模型对象。您可能拥有页面状态以及必须全部跟踪的多个其他模型对象。这是在ViewModel中完成的。
例如,您可能有关于状态栏中显示的已登录用户的附加信息,以及运行检测文本文件更改的服务。
您可能还有一个用于编辑Student对象的窗体。如果您打算验证这些更改,那么在修改完成之前,您不希望直接编辑Student对象。在这种情况下,ViewModel可以充当临时存储位置。
关于上述内容的注意事项:在模型中进行验证并不少见,但即使如此,您仍然希望用户能够在编辑表单的过程中输入无效值。例如,如果您的模型在字段中不允许零长度值,您仍然希望使用户能够删除该值,移动到另一个字段(例如,复制它),然后返回到字段并完成编辑(粘贴)。如果你直接绑定到模型,那么你的验证逻辑可能不会处理这个“中间”,“尚未完成”的状态,只要你愿意。例如,您可能不想在验证错误完成后点击“保存”来提醒用户。
您也可能在ViewModel中有Command对象来处理按钮点击等。这些将是模型中无用的域特定对象。
当您需要过滤或以某种方式暂时“修改”模型对象以获得屏幕上的某些内容时,ViewModels也很有用。例如,您可能想要显示系统中所有用户的列表以及其中前十名执行者的实时列表(每10秒更新一次)。或者您可能想要显示报告列表和显示整体使用率的图表等。在ViewModel中将过滤,排序和自定义数据。
该模型,另一方面,通常是尽可能纯。理想情况下,您只需要POCOs(通常)模拟永久存储(数据库或您有什么)中的内容。如果您的持久存储具有FirstName和LastName字段,那么您的Model也是如此。只有在你的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