您现在的位置是:亿华云 > IT科技类资讯
Mvvm模式和在Wpf中的实现之一Mvvm模式简介
亿华云2025-10-03 20:26:43【IT科技类资讯】8人已围观
简介0x00 写在前面的废话之前一直用Winform。刚开始看了下感觉跟Winform区别不大,控件可以拖进去,选中了控件属性面板可以设置属性、事件面板可以监听事件,后台代码处理事件,一切都那么的熟悉。X
0x00 写在前面的模式m模废话
之前一直用Winform。刚开始看了下感觉跟Winform区别不大,中的之控件可以拖进去,实现式简选中了控件属性面板可以设置属性、模式m模事件面板可以监听事件,中的之后台代码处理事件,实现式简一切都那么的模式m模熟悉。XAML布局也跟Android布局很像,中的之所以没学习就直接开始了,实现式简觉得摸索摸索基本就差不多了吧。模式m模
结果各种不适应,中的之拖控件拖进去后总是实现式简调整不好显示方式,控件在后台代码中操作找不到方法,模式m模对于WPF介绍的中的之各种特点也毫无体会,总想着换回去。实现式简后来看了刘铁猛的《深入浅出WPF》,里面说WPF就要用WPF的方式来开发。这才认真开始学WPF。现在控件面板和属性面板都已经用的很少了,界面布局基本全部用代码搞定,感觉任何一个细节都能控制到。再后来接触到了MVVM,源码库更加体会到了以MVVM模式开发WPF带来的好处。
现在除非要求已经不再用Winform了,小工具和测试程序直接在后台写代码,复杂一点的需要长期使用和维护的用MVVM模式。这个系列的文章主要写一下自己对MVVM的理解和核心部分的简易实现方式。
0x01 MVVM模式简介
MVVM是Model、View、ViewModel的简写,这种模式的引入就是使用ViewModel来降低View和Model的耦合,说是降低View和Model的耦合。也可以说是是降低界面和逻辑的耦合,理想情况下界面和逻辑是完全分离的,单方面更改界面时不需要对逻辑代码改动,同样的逻辑代码更改时也不需要更改界面。源码下载同一个ViewModel可以使用完全不用的View进行展示,同一个View也可以使用不同的ViewModel以提供不同的操作。
1.Model
Model就是一个class,是对现实中事物的抽象,开发过程中涉及到的事物都可以抽象为Model,例如客户,客户的姓名、编号、电话、住址等属性也对应了class中的Property,客户的下订单、付款等行为对应了class中的方法。
2. View
View很好理解,就是界面。
3. ViewModel
上面说过Model抽象,那么ViewModel就是对View的抽象。显示的数据对应着ViewMode中的Property,云服务器执行的命令对应着ViewModel中的Command。
0x02 WPF中MVVM的解耦方式
在WPF的MVVM模式中,View和ViewModel之间数据和命令的关联都是通过绑定实现的,绑定后View和ViewModel并不产生直接的依赖。具体就是View中出现数据变化时会尝试修改绑定的目标。同样View执行命令时也会去寻找绑定的Command并执行。
反过来,ViewModel在Property发生改变时会发个通知说“名字叫XXX的Property改变了,你们这些View中谁绑定了XXX也要跟着变啊!”,至于有没有View收到是不是做出变化也不关心。ViewModel中的Command脱离View就更简单了,因为Command在执行操作过程中操作数据时,根本不需要操作View中的数据,只需要操作ViewModel中的Property就可以了,Property的变化通过绑定就可以反映到View上。这样在测试Command时也不需要View的参与。这也是我在接触WPF初期时根本理解不了的所谓数据驱动。
这样一来ViewMode可以在完全没有View的情况下测试,View也可以在完全没有ViewModel的情况下测试(当然只是测试界面布局和动画等业务无关的内容)。
0x3 MVVM框架需要解决的问题
从图中可以看出如果要实现一套MVVM框架,需要解决的最基本的问题就是数据绑定和命令绑定。此外由于UI中会产生大量的事件,因此还需要将事件绑定到MVVM中的命令上。后面的文章将依次尝试解决这些问题。最后还是要说一下任何设计模式都是参考,都有使用场景,切忌生搬硬套。实际开发中应根据项目特点采取适配性更强的模式。
本文转载自微信公众号「CSharp编程大全」,可以通过以下二维码关注。转载本文请联系CSharp编程大全公众号。
很赞哦!(469)
相关文章
- 5、使用企业名称的英文名称作为域名也是国内许多企业选择域名的一种方式,特别适合一些与计算机、网络和通信相关的行业。
- 码农欢乐多:属于程序员的爆笑时刻
- 把 SpringBoot 部署到 K8s,竟然翻车了!
- Java中写了个AOP,差点被开除
- 网站页面结构改版,仅是页面样式发生变化,不会对排名、收录有影响;只有涉及到页面URL改变,才会对网站排名、收录有影响。
- 手写Axios核心原理
- 开源平台 GitLab又开始搞事情:大规模封杀开发者账户
- 11月全国程序员平均工资出炉
- 第六:这个圈子里的域名确实是赚钱的一些大玩家,至于小米农,有多少赚钱?几乎没有,也就是说,轿子里只有一个人,而且大多数人都抬着轿子。
- 机器人流程自动化(RPA)和业务流程管理(BPM)如何结合在一起?
站长推荐
如果你的潜在终端必须是这个米(域名),那么潜在终端并不多,也没有硬通货,那么你的域名应该在终端有兴趣购买时出售。否则,你可能得自己留着吃。
聊聊Const 和 Object.freeze() 的区别
Python五个隐藏的特性,你可能从未听说过
线程池运用不当的一次线上事故
用户邮箱的静态密码可能已被钓鱼和同一密码泄露。在没有收到安全警报的情况下,用户在适当的时间内不能更改密码。在此期间,攻击者可以随意输入帐户。启用辅助身份验证后,如果攻击者无法获取移动电话动态密码,他将无法进行身份验证。这样,除非用户的电子邮件密码和手机同时被盗,否则攻击者很难破解用户的邮箱。
查看运行中Java Class 源码的三板斧
Python3.10第二个alpha版本!最新特性值得关注
软件架构设计分层模型和构图思考