1. Mvvm是什么,Mvvm是怎么来的?
Mvvm模式广泛应用在WPF项目开发中,使用此模式可以把UI和业务逻辑分离开,使UI设计人员和业务逻辑人员能够分工明确。

Mvvm模式是根据MVP模式来的,可以简单的说,Mvvm模式就是WPF版的MVP模式。MVP模式,MVC模式,这几个模式都是为了抽离出UI逻辑和业务逻辑。

2. 使用Mvvm模式可以参考的主流框架及简单介绍。
主流开源框架:Simple Mvvm,Mvvm Light和Prism。
Simple Mvvm和Mvvm Light基本一致,都是对Mvvm模式的基础封装,并加入了一些不错的功能,消息传输机制,依赖注入等等。开发中小项目推荐使用这两个的其中一个。
Prism是微软给出的一个Mvvm框架,不过它的关注点不仅仅是Mvvm模式,我觉得主要是模块的思想更多一些。大项目的话才推荐使用这个框架,比如一个系统需要分为N个团队进行不同模块的开发,然后再组织成一个系统。

3. 使用Mvvm模式的思想分析问题。
现在有一个功能:用户填入姓名,年龄,选择最喜欢的颜色,然后点击确定按钮提交。就是这样简单的一个调查表。
a.首先设计UI,UI看起来可能是这样的:


b.根据UI去设计对应的ViewModel层需要那些属性,数据和命令:

 Name:string
 Age:int
 FavoriteColor:string
 Submit:Command

c.在ViewModel层的SubmitCommand命令中,调用Model层的Submit方法进行逻辑处理。Model层看起来可能是这样的:

  public string Name { get; set; }
 public int Age { get; set; }
 public string FavoriteColor { get; set; }
 public void Submit() { ... }

4. 看到的一些对Mvvm模式的看法,觉得不太正确。
a.Code-Behind文件要保证绝对干净。
这个说法有些太绝对了,理想状态下,View层的Code-Behind文件中只有在构造函数中调用初始UI元素的一行代码及设置View层的DataContext为对于的ViewModel层。
其实,Code-Behind中还可以些一些UI的逻辑的,比如一些丰富的动画效果,或者直接设置某个元素的样式等。
不过,Code-Behind中确实是不可以写业务逻辑的。
b.ViewModel层不能是Model层的简单封装,ViewModel层也不能是View层的简单映射。ViewModel层和View层要绝对分离,ViewModel层要和View层一样去面向需求设计。
我觉得这样做有点太过了。
Mvvm的目的只是为了UI逻辑和业务逻辑的分离,你说业务逻辑和数据要写在哪一层呢?没错,Model层。
ViewModel层的主要责任是表现逻辑和状态,即ViewModel层是连接View层和Model层的。Model层的一些业务逻辑的状态是需要通过ViewModel层暴露给View层来反映给软件使用者的。

5.我对WPF+Mvvm模式开发的一些经验。
a.WPF的几个重要概念要熟练理解和运用:模板,依赖属性,数据绑定。和Mvvm模式的结合使用,能发挥出很好的效果。
b.团队中的成员最好能够对Mvvm模式有统一的理解和认识。
c.Mvvm模式只是一个模式而已,不是有了Mvvm模式就能写出优美的代码,涉及到具体的业务逻辑,还是需要你以及你的团队有足够强的设计能力。

GitHub:https://github.com/backslash112/

最新文章

  1. 使用Navicat连接Oracle数据时的一些问题,连接时错误:ORA-28547,新建用户后连接时错误:ORA-01017
  2. elasticsearch5.0集群+kibana5.0+head插件插件的安装
  3. 网站SEO之百度优化不得不知的铁人三项规则
  4. JavaScript Patterns 2.11 Writing Comments
  5. SQL中的模糊查询
  6. css3实现非矩形图片效果
  7. 怎样在loop中处理异常
  8. 字符设备驱动[深入]:linux cdev详解
  9. Writing a Windows Shell Extension(marco cantu的博客)
  10. uva-11234 Expressions
  11. WebApi HttpMsgHanler的执行顺序
  12. 热部署环境下,dubbo序列化的bug和优化
  13. 用TensorFlow实现文本分析模型,做个聊天机器人
  14. 根据userAgent判断打开网页的所在终端,以及浏览器
  15. 异步设备IO OVERLAPPED结构(设备内核对象 事件内核对象 可提醒IO)
  16. (算法)Word Break
  17. 转:D3DXVec3TransformNormal() 与 3DXVec3TransformCoord() 的区别
  18. Tomcat数据源总结
  19. Vue 动态图片加载路径问题和解决方法
  20. oracle 表的创建与管理 约束

热门文章

  1. 今日SGU 5.15
  2. 今日SGU 5.13
  3. Java并发包之Semaphore用法
  4. C# 调用者信息特性(Attribute)
  5. js中由undefined说起
  6. Google开源新的 RISC-V IP核: “BottleRocket”(https://cnrv.io)
  7. Kinect 开发 —— WaveHand
  8. HDU 2017 Multi-University Training Contest - Team 4 1009 1011
  9. 使用dockerfile构建镜像(docker build)
  10. Install Docker Mac OS X