c# – MVVM中的模型是什么?

前端之家收集整理的这篇文章主要介绍了c# – MVVM中的模型是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经阅读了几篇关于MVVM模式的文章,教程和博客文章.但有一件事我不明白.采取三个“层”:

>模型
>查看
>查看模型

据我所知,MVVM模型包含“原始”数据,例如:学生班级的姓名和地址.视图模型向视图公开属性,该属性表示模型的数据.

视图模型中属性的示例

  1. public string Name {
  2. get { return model.Name; }
  3. set { model.Name = value; }
  4. }

模型示例

  1. private string name;
  2.  
  3. public string Name {
  4. get { return name; }
  5. set { name = value; }
  6. }

这可能听起来有点愚蠢,但这不会产生冗余吗?为什么我必须在模型和视图模型中保留名称?为什么不能完全处理视图模型上的名称

解决方法

在这样一个简单的例子中,这个答案是肯定的(这是不合理的冗余).但是,据推测,一个页面将包含的不仅仅是一个Model对象.您可能具有页面状态以及必须全部跟踪的多个其他Model对象.这是在viewmodel中完成的.

例如,您可能具有有关状态栏中显示登录用户的其他信息,以及运行以检测文本文件更改的服务.

您可能还有一个用于编辑Student对象的表单.如果您打算验证这些更改,那么在验证修改之前,您不希望直接编辑Student对象.在这种情况下,viewmodel可以充当临时存储位置.

关于上述内容的注意事项:在模型中进行验证并不罕见,但即使这样,您也可能希望用户在编辑表单的过程中能够输入无效值.例如,如果您的模型不允许字段中的零长度值,您仍然希望允许用户删除该值,移动到另一个字段(例如,复制它)然后返回到字段,完成编辑(粘贴).如果您直接与模型绑定,那么您的验证逻辑可能无法处理您所希望的“中间”,“尚未完成”状态.例如,您可能不希望在用户完成并点击“保存”之前将验证错误归咎于您的用户.

您也可能在viewmodel中有Command对象来处理按钮点击等.这些将是特定于域的对象,在模型中无用.

当您需要过滤或以某种方式临时“修改”模型对象以在屏幕上获得有用的东西时,viewmodel也很有用.例如,您可能希望显示系统中所有用户的列表以及其中前十名执行者的实时列表(每10秒更新一次).或者,您可能希望显示报告列表和显示总体使用率等的图表.过滤,排序和自定义数据将在viewmodel中进行.

另一方面,模型通常尽可能纯.理想情况下,您只需要POCOs(通常)模型确切地说明您的持久存储(数据库或您拥有的内容)中的内容.如果您的持久存储具有FirstName和LastName字段,那么您的模型也是如此.只有在viewmodel中才会将它们组合起来以获取名称字段(“最后一个”或“最后一个”,具体取决于视图的需要).

例如:

  1. namespace Model
  2. {
  3. public class Student
  4. {
  5. public string FirstName { get; set; }
  6. public string LastName { get; set; }
  7. }
  8.  
  9. public class Class
  10. {
  11. public string Name { get; set; }
  12. public float score { get; set; }
  13. }
  14. }
  15.  
  16. namespace viewmodel
  17. {
  18. public class EditStudentRecordviewmodel
  19. {
  20. private Model.Student _student;
  21. private IEnumerable<Model.Class> _studentClasses;
  22.  
  23. /* Bind your View to these fields: */
  24. public string FullName
  25. {
  26. return _student.LastName + "," + _student.FirstName;
  27. }
  28. public string FirstName { get; set; }
  29. public string LastName { get; set; }
  30.  
  31. public IEnumerable<Model.Class> PassingClasses
  32. {
  33. get
  34. {
  35. return _studentClasses.Where( c => c.score >= 78 );
  36. }
  37. }
  38.  
  39. public IEnumerable<Model.Class> FailingClasses
  40. {
  41. get
  42. {
  43. return _studentClasses.Where( c => c.score < 78 );
  44. }
  45. }
  46.  
  47. public void Save()
  48. {
  49. List<string> l_validationErrors = new List<string>();
  50. if ( string.IsNullOrEmpty( this.FirstName ) )
  51. l_validationErrors.Add( "First Name must not be empty." );
  52. if ( string.IsNullOrEmpty( this.LastName ) )
  53. l_validationErrors.Add( "Last Name must not be empty." );
  54.  
  55. if ( l_validationErrors.Any() )
  56. return;
  57.  
  58. _student.FirstName = this.FirstName;
  59. _student.LastName = this.LastName;
  60. Model.Utilities.SaveStudent( _student );
  61. }
  62. }
  63. }

猜你在找的C#相关文章