-
在WPF开发中,经典的编程模式是MVVM,是为WPF量身定做的模式,该模式充分利用了WPF的数据绑定机制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI显示和逻辑代码的耦合度,如需要更换界面时,逻辑代码修改很少,甚至不用修改。
-
与
WinForm开发
相比,我们一般在后置代码中会
使用控件的名字来操作控件的属性来更新UI
,而在
WPF中通常是通过数据绑定来更新UI
;在响应用户操作上,
WinForm是通过控件的事件来处理
,而
WPF可以使用命令绑定的方式来处理
,耦合度将降低。
结构模型如下:
-
Model:
就是系统中的对象,可包含属性和行为(就是一个class,是对现实中事物的抽象,开发过程中涉及到的事物都可以抽象为Model,例如客户,客户的姓名、编号、电话、住址等);
-
View:
就是用xaml实现的界面,负责与用户交互,接收用户输入,把数据展现给用户;
-
ViewModel:
是一个C#类,负责收集需要绑定的数据和命令,聚合Model对象,通过View类的DataContext属性绑定到View,同时也可以处理一些UI逻辑。显示的数据对应着ViewMode中的Property,执行的命令对应着ViewModel中的Command。
三者之间的关系:
View对应一个ViewModel,ViewModel可以聚合N个Model,ViewModel可以对应多个View
MVVM的
根本思想
就是
界面和业务功能进行分离
,
View的职责
就是
负责如何显示数据及发送命令
,
ViewModel的功能
就是
如何提供数据和执行命令
。各司其职,互不影响。
-
在实际的业务场景中我们经常会遇到客户对界面提出建议要求修改,使用MVVM模式开发,当设计的界面不满足客户时,我们仅仅只需要对View作修改,不会影响到ViewModel中的功能代码,减少了犯错的机会。
-
随着功能地增加,系统越来越复杂,相应地程序中会增加View和ViewModel文件,将复杂的界面分离成局部的View,局部的View对应局部的ViewModel,功能点散落在各个ViewModel中,每个ViewModel只专注自己职能之内的事情。ViewModel包含了View要显示的数据,并且知道View的交互代码,所以ViewModel就像一个无形的View。
-
使用MVVM架构具有以下
优势
:
-
易维护(低耦合)
,视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的”View”上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
-
灵活扩展(可重用性)
,可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑;
-
易测试
,界面向来是比较难于测试的,而现在测试可以针对ViewModel来写
-
独立开发
,开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xml代码。
使用MVVM框架的好处就是当前后端进行一些数据交互的时候,前端可以通过Ajax请求对后端做数据持久化,不需要刷新整个页面,只需要改动DOM里需要改动的那部分数据和内容,特别是对于移动端应用场景,刷新页面的代价太昂贵,会重新加载很多资源,虽然有些资源会被缓存,但是页面的DOM、JS、CSS都会被浏览器重新解析一遍,因此,移动端页面经常会做成SPA单页应用,在这个基础上就诞生了很多MVVM框架,如Angular、React、Vue。
-
针对具有复杂交互逻辑的前端应用
-
提供基础的架构抽象
-
通过Ajax数据持久化,保证前端用户体验
-
NuGet引用MVVM框架包
引入该框架包之后, 默认会在目录下创建ViewModel层的示例代码
-
通过
在MainViewModel中创建一些业务代码
, 将其与MainWindow.xaml 通过上下文的方式关联起来, 而MainWindow则是通过Binding的写法 引用业务逻辑的部分。
-
2.1.
在
MainViewModel
中, 添加同一个班级名称, 与学生列表, 分别用于显示在文本 和列表上展示, Command则用于绑定DataGrid的双击命令上, 通过双击, 展示点击行的学生信息:
-
2.2.
设计UI层,在
XMAL
文件中 添加一个文本用于显示班级名称, 添加一个DataGrid 用于展示学生列表, 同时DataGrid中添加一个绑定的命令(红色区域)
关于上面红色圈的代码, 为一种绑定语法, 主要在MouseBinding中, MouseAction 以为触发的事件类型, CommandParameter 则是命令传递的参数, 也就是DataGrid选中的一行的类型 Student。Command 则是MainViewModel中定义的Command。
RelativeSource FindAncestor
,主要用于控件模板或可预测的自包含 UI 组合。
-
2.3.
前端的绑定工作已经设置好, 后台的代码也添加完成, 目前只需要将MainViewModel 与MainWindow 通过
MainWindow
的DataContext关联即可
运行效果:
RaisePropertyChanged() 实现动态通知更新
-
通过set访问器更新ClassName的同时, 调用RaisePropertyChanged 方法, 界面刷新更新后的值;
-
添加一个无参数的UpdateCommand , 并设置为 UpdateText 手动把ClassName更新为 “高三三班”:
-
UI层添加一个简单按钮, 绑定后台的UpdateCommand命令
运行效果:
文章参考来源:
链接:
C#架构设计-MVVM
链接:
WPF自学入门
.
链接:
MVVM模式简介
.
链接:
WPF-MVVM框架
.
MVVM框架文章目录MVVM框架前言一、MVVM框架简介1. 什么是MVVM?2. MVVM的优势3.MVVM的应用场景二、MVVM使用及示例前言在WPF开发中,经典的编程模式是MVVM,是为WPF量身定做的模式,该模式充分利用了WPF的数据绑定机制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI显示和逻辑代码的耦合度,如需要更换界面时,逻辑代码修改很少,甚至不用修改。与WinForm开发相比,我们一般在后置代码中会使用控件的名字来操作控件的属性来更新UI,而在WPF中通常是通过
MVVM
是Model-View-ViewModel的简写。微软的
WPF
带来了新的技术体验,如Silverlight、音频、视频、3D、动画……。这导致了软件UI层更加细节化、可定制化。同时,在技术层面,
WPF
也带来了诸如Binding、DependencyProperty、RoutedEvents、Command、DataTemplate、ControlTemplate等新特性。
MVVM
(Model-View-ViewModel)
框架
的由来便是MVP(Model-View-Presenter)模式与
WPF
结合的应用方式时发展演变过来的一种新型架构
框架
。它立足于原有MVP
框架
并且把
WPF
的新特性
作者本人以前是做C++的,当然很顺利的进入到WinForm,这也让我基本没有View-Model思维。学习
WPF
说白点也是因为其强大的UI,其实我忽视了很重要的一点,直到接触了
MVVM
框架
,其实Web前后端开发已经指明了未来编程趋势,各干各的:完美的前段和强劲的后端,个人是这么认为的。
WPF
是微软视其为下一代用户界面技术,XAML的使用就是为了降低耦合度。那么我们不得不说说WinForm和WP......
至于啥是
MVVM
在此不再赘述,可以参考这位大神写的博客 : http://www.cnblogs.com/durow/p/4853729.html
在此只是搭建一个简单的
框架
, 仅供学习参考, 欢迎转载. 如有任何问题,意见或建议欢迎随时批评指正.
如有侵权请及时联系删除,谢谢.
包含的
基础
类参考如下截图,具体类的作用我会随着代码展开做简短的解释.
类图参考:
首先我创建了三个文...
WPF
MVVM
框架
例程是使用
WPF
技术和
MVVM
架构模式实现的一种程序开发方案,它的主要目的是将应用程序的业务逻辑与用户界面分离。
MVVM
(Model-View-ViewModel)架构模式是一种广泛应用于
WPF
开发的模式,它将业务逻辑、用户界面和数据模型分别抽象为三个独立的层,从而实现了很好的松耦合设计,使得程序代码可维护性更高,在多个程序员共同开发的情况下也能有效的降低开发的复杂度。
在
WPF
MVVM
框架
例程中,一般包含了ViewModel、View、Model三个关键组件,其中ViewModel实现了业务逻辑的处理和与View的数据交互;View是用户界面,是程序的视觉形式呈现,而Model主要是数据模型和数据存储。
WPF
MVVM
框架
例程的实现方式很多,最广泛应用的是利用开源库
Mvvm
Light实现。在使用
Mvvm
Light开发
WPF
应用程序中,可以大大降低代码的复杂度、提高代码重用性,同时可以有效地实现业务逻辑与用户界面的分离,同时减少界面逻辑的耦合度,并实现了视图状态与业务状态的分离。
总的来说,
WPF
MVVM
框架
例程是
WPF
开发中一种非常优秀的
框架
,它的实现可以大大提高
WPF
程序的开发效率和代码质量。通过学习
WPF
MVVM
框架
例程,在实际开发中运用
MVVM
架构模式,能够使开发者更好地开发出高质量的应用程序,提高软件的稳定性和可扩展性。