c# – MVVM中的模型是什么?
我已经阅读了几篇关于MVVM模式的文章,教程和博客文章.但有一件事我不明白.采取三个“层”:
>模型 据我所知,MVVM模型包含“原始”数据,例如:学生班级的姓名和地址.视图模型向视图公开属性,该属性表示模型的数据. 视图模型中属性的示例 public string Name { get { return model.Name; } set { model.Name = value; } } 模型示例 private string name; public string Name { get { return name; } set { name = value; } } 这可能听起来有点愚蠢,但这不会产生冗余吗?为什么我必须在模型和视图模型中保留名称?为什么不能完全处理视图模型上的名称? 解决方法
在这样一个简单的例子中,这个答案是肯定的(这是不合理的冗余).但是,据推测,一个页面将包含的不仅仅是一个Model对象.您可能具有页面状态以及必须全部跟踪的多个其他Model对象.这是在ViewModel中完成的.
例如,您可能具有有关状态栏中显示的登录用户的其他信息,以及运行以检测文本文件更改的服务. 您可能还有一个用于编辑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 ); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Flash跨域劫持用户操作
- postgresql命令行(psql)
- c – XCode助理编辑器不显示我的.h和我的相关.cpp文件
- Nosql Mongodb之旅(2)
- 一个有趣的应用:xml+class自定义属性前缀
- cocos2d-x getBoundingBox getContentSize getTextureRect
- actionscript-3 – 如何检测该区域是否100%绘制为as3
- 'cocos2d::LabelTTF::getContentSize': 被声明为已
- ruby-on-rails – 我可以将默认值传递给rails生成迁移吗?
- c# – RED5媒体服务器或任何其他带.NET API的跨平台媒体服务