>模型
>查看
>查看模型
据我所知,MVVM模型包含“原始”数据,例如:学生班级的姓名和地址.视图模型向视图公开属性,该属性表示模型的数据.
视图模型中属性的示例
public string Name { get { return model.Name; } set { model.Name = value; } }
模型示例
private string name; public string Name { get { return name; } set { name = value; } }
解决方法
例如,您可能具有有关状态栏中显示的登录用户的其他信息,以及运行以检测文本文件更改的服务.
您可能还有一个用于编辑Student对象的表单.如果您打算验证这些更改,那么在验证修改之前,您不希望直接编辑Student对象.在这种情况下,viewmodel可以充当临时存储位置.
关于上述内容的注意事项:在模型中进行验证并不罕见,但即使这样,您也可能希望用户在编辑表单的过程中能够输入无效值.例如,如果您的模型不允许字段中的零长度值,您仍然希望允许用户删除该值,移动到另一个字段(例如,复制它)然后返回到字段,完成编辑(粘贴).如果您直接与模型绑定,那么您的验证逻辑可能无法处理您所希望的“中间”,“尚未完成”状态.例如,您可能不希望在用户完成并点击“保存”之前将验证错误归咎于您的用户.
您也可能在viewmodel中有Command对象来处理按钮点击等.这些将是特定于域的对象,在模型中无用.
当您需要过滤或以某种方式临时“修改”模型对象以在屏幕上获得有用的东西时,viewmodel也很有用.例如,您可能希望显示系统中所有用户的列表以及其中前十名执行者的实时列表(每10秒更新一次).或者,您可能希望显示报告列表和显示总体使用率等的图表.过滤,排序和自定义数据将在viewmodel中进行.
另一方面,模型通常尽可能纯.理想情况下,您只需要POCOs(通常)模型确切地说明您的持久存储(数据库或您拥有的内容)中的内容.如果您的持久存储具有FirstName和LastName字段,那么您的模型也是如此.只有在viewmodel中才会将它们组合起来以获取名称字段(“最后一个”或“最后一个”,具体取决于视图的需要).
例如:
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 ); } } }