目录

介绍

代码

示例用法


介绍

我一直在开发一个工具来帮助团队中的其他开发人员为他们的MVC应用程序创建菜单项。所讨论的工具是一个使用MVVM模式的WPF桌面应用程序。我正在编写模型和相关的视图模型,这让我感到震惊,这些年来我一直在“艰难地”这样做。我在*每个ViewModel*中编写了一系列方法,在模型和视图模型之间来回切换数据。对于某些模型来说,这涉及20个或更多属性,并且支持它们所需的编码是纯粹的苦差事。昨天,我提出了另一种选择。

代码

我使用以下代码创建了一个类,并从我的视图模型类继承了该类:

public enum MVVMDirection { FROM, TO };/// <summary>
/// ViewModel base class
/// </summary>
public class VMBase
{/// <summary>/// Move the data from the model to the viewmodel, using reflection. /// Property names in both objects MUST be the same (both name and type)/// </summary>/// <typeparam name="TModel">The model's type</typeparam>/// <param name="model">The model object the data will be moved from</param>public void UpdateFromModel<TModel>(TModel model){this.Update<TModel>(model, MVVMDirection.FROM);}/// <summary>/// Move the data from the viewmodel to the model, using reflection. /// Property names in both objects MUST be the same (both name and type)/// </summary>/// <typeparam name="TModel">The model's type</typeparam>/// <param name="model">The model object the data will be moved from</param>public void UpdateToModel<TModel>(TModel model){this.Update<TModel>(model, MVVMDirection.TO);}/// <summary>/// Update to or from the model based on the specified direction. Property names in both /// objects MUST be the same (both name and type), but properties used just for the view /// model aren't affected/used./// </summary>/// <typeparam name="TModel">The model's type</typeparam>/// <param name="model">The model object the data will be moved to/from</param>/// <param name="direction">The direction in which the update will be performed</param>public void Update<TModel>(TModel model, MVVMDirection direction){PropertyInfo[] mProperties  = model.GetType().GetProperties();PropertyInfo[] vmProperties = this.GetType().GetProperties();foreach(PropertyInfo mProperty in mProperties){PropertyInfo vmProperty = this.GetType().GetProperty(mProperty.Name);if (vmProperty != null){if (vmProperty.PropertyType.Equals(mProperty.PropertyType)){if (direction == MVVMDirection.FROM){vmProperty.SetValue(this, mProperty.GetValue(model));}else{vmProperty.SetValue(model, mProperty.GetValue(this));}}}}}
}

示例用法

与任何代码一样,使用这些方法的方法不止一种。在我自己的例子中,我的典型ViewModel对象包含一个表示模型的属性,构造函数接受一个模型对象参数。从参数设置Model属性后,构造函数会对UpdateFromModel()方法执行初始调用。我的视图模型看起来像这样:

// ViewModelBase contains the methods that are discussed in this tip,
// and in my case, ViewModelBase inherits from
// a class called Notifiable which inherits from INotifyPropertyChanged
// and contains properties to support using view
// models in a WPF environment.
public partial class MyViewModel : ViewModelBase
{private string property1;public MyModel Model { get; set; }public string Property1 { get { return this.property1; }set{if (this.property1 != value){this.property1 = value;// in the "Notifiable" classthis.NotifyPropertyChanged();}}}public MyViewModel(MyModel model){this.Model = model;// in the ViewModelBase classthis.UpdateFromModel<mymodel>(this.Model);}
}

我使用Model属性是因为我不希望在用户准备好之前提交对模型数据的更改(由UI中的操作决定)。当然,您可以直接从viewmodel属性更新模型的值(通过应用程序UI操作),如果这是您需要做的,但这不是*我*做的方式。至于对象属性之间的数据传输,您可以想象一下这类代码的长列表,您可以理解为什么我想出了这些基类方法。

我知道你们中的一些人阅读这个可能会有不同的观点,因为它与你放置代码的位置以及你如何实现MVVM模式有关,所以这里有一个例子,它有一点点不同,在实例化视图模型后,你也可以在viewmodel对象的外部执行初始方法调用,如下所示:

// create and populate your model however you want/need to do it
MyModel modelObj = new MyModel();// do something to populate your model if necessary (my model objects are
// created and populated via calls to the database)// create your viewmodel
VMMyModel vmObj = new VMMyModel();
// and move the model data to the viewmodel
vmObj.UpdateFromModel<MyModel>(modelObj);// change the viewmodel property values
// and then move it back to the model
vmObj.UpdateToModel<MyModel>(modelObj);// save your model to the data source from which it was retrieved
modelObj.CallYourSaveMethod();

我不可能想出一个确定的用例列表,我真的对实现样式的宗教讨论不感兴趣,所以我希望你能够了解如何利用这些代码。

Model和ViewModel之间的通用MVVM数据交换相关推荐

  1. 1、Profibus协议包含那三个子集?分别针对哪种应用?4、在 PROFIBUS 网络中,一类主站和二类主站的功能有何不同?主站和主站之间、主站和 从站之间是怎样进行数据交换的?

    1.Profibus协议包含那三个子集?分别针对哪种应用? profibus-PA:用于现场级过程自动化,提供本征安全.因此也适合在危险区域使用.比如对温度.压力.流量.成分.液位或物位等过程参数的控 ...

  2. Json学习总结(7)——JSON为什么是数据交换格式的首选

    一.XML 在讲JSON之前,我觉得有必要先带大家了解一下XML(Extensible Markup Language 可扩展标记语言),因为JSON正在慢慢取代XML. 1.XML起源 早期Web发 ...

  3. 政务部门数据交换共享方式对比

    近年来我国各级政府已经进入了信息化高速发展的时代,随着各级政府业务开展的同时,业务数据越来越多的积累,部门之间为打破"信息孤岛",开展业务协同进行了不懈的努力.随着国家政策的不断完 ...

  4. JSON——IT技术人员都必须要了解的一种数据交换格式

    JSON作为目前Web主流的数据交换格式,是每个IT技术人员都必须要了解的一种数据交换格式.尤其是在Ajax和REST技术的大行其道的当今,JSON无疑成为了数据交换格式的首选! 今天大家就和猪哥一起 ...

  5. VC++中对话框数据交换【十全十美】

    如果使用 DDX 机制,则通常在 OnInitDialog 处理程序或对话框构造函数中设置对话框对象成员变量的初始值.在对话框即将显示前,框架的 DDX 机制将成员变量的值传输给对话框中的控件,当对话 ...

  6. 网络隔离的办公网和互联网,如何安全地进行数据交换?

    根据国家<信息安全技术网络安全等级保护安全设计技术要求>文件,企业网络可以按照不同的等级保护级别进行安全域划分,目前在企业内部,网络隔离已成为非常普遍的现象,特别是对于数据安全和网络安全的 ...

  7. 计算机网络FMD是什么,计算机网络中的数据交换

    计算机网络中,数据交换的类型有:电路交换.报文交换.分组交换. ☞数据交换--电路交换 Q:如何实现数据通过网络核心从源主机到达目的主机? A:数据交换.(现在网络主要采用的技术是数据交换) 2台主机 ...

  8. Vue基础——VueJS是什么、Vue的优缺点、vue2和vue3的模板区别、MVVM数据双向绑定、Vue的安装和使用、Vue模板语法-文本渲染、常用的vue的指令

    目录 一.VueJS是什么? 二.Vue的优缺点 三.MVVM 数据双向绑定 四.Vue的安装和使用 五.Vue模板语法-文本渲染 六.常用的vue的指令 一.VueJS是什么? 它是一个轻量级MVV ...

  9. ansys与solidworks关联失败_SolidWorks与ANSYS之间的数据交换方法研究

    引言 SolidWorks软件是世界上第1个基于Windows开发的三维CAD系统,其功能强大,用途广泛,是一款智能型高级CAD/CAE/CAM组合软件.ANSYS软件是集结构.流体.电场.磁场.声场 ...

最新文章

  1. 利用脚本将文字插入到图片或进行多个图片拼接
  2. Servlet_生命周期方法
  3. word List 41
  4. 分享42个精美的免费PSD素材
  5. Qt ui-setupUi(this)的作用
  6. 安卓3d游戏引擎_3D球闯关游戏-3D球闯关游戏安卓官方版预约 v1.2.5
  7. Kickstart +ftp+dhcp+tftp实现Linux系统的无人值守安装
  8. 科学计算机计算等比求和公式,等比数列求和公式
  9. AI数据服务行业进入“认知战争”,云测数据凭什么稳居行业TOP1?
  10. Win10电脑系统使用技巧
  11. 求解答!iframe在IE浏览器加载页面无反应问题
  12. java——财务支票大写汉字转换
  13. 【C语言】函数参数试探:传指针与传引用——以队列为例
  14. 批量打印二维码的软件---使用心得(领跑条码标签打印软件)
  15. java判断线程阻塞_记一次锁使用不当导致Dubbo线程阻塞问题
  16. 北航新款机器人,粘在鲨鱼上搭便车!
  17. 2022年最富有的科技亿万富翁前二十名,中国占3位
  18. 《如何高效学习》笔记
  19. [4G5G专题-128]:5G培训关键技术篇-1-5G的网络概述
  20. ASV并行断言中时序的描述sequence

热门文章

  1. python创建包含双引号的字符串代码_python 字符串组成MySql 命令时,字符串含有单引号或者双引号导致出错解决办法...
  2. canvas 绘制直线 并选中_在画布中使用路径-Canvas的基本操作
  3. mac mysql 免密登录_Mac 免密登陆
  4. 编程师代码G都喜欢的|细致场景森系插画手机壁纸
  5. 设计灵感|优秀案例教你如何像杂志一样排版?
  6. 可编辑杂志模板|简单的得到一个完整的杂志预先设计版式
  7. 相比JPG,PNG矢量图片才是设计师的首选素材
  8. 电商淘宝天猫美妆页面PSD分层模板,优秀作品促进品牌提升
  9. svn增量打包部署_超详细的jenkins持续集成工作原理、功能、部署方式等介绍
  10. sql的的over不能和group by一起使用吧_CellRouter的使用