自写了WPF入门系列(点击学习)文章,收到很多大学生的私信,经常会问一些MVVM的问题,由于自己对MVVM也并不了解,遇到问题也是经常请朋友帮忙看看,趁着业余时间,经过一段时间得学习、开始写MVVM系列的文章,主要写一下自己对MVVM的理解,希望这不仅是对自己成长的记录,也能对同学们有所帮助。
第1讲
MVVM教程(一)
首先说一下概念:
MVVM是Model-View-ViewModel的缩写,具体解释为:
- Model:现实世界中对象的抽象结果。可以理解为数据模型,对应着一个Class。
- View:界面。可以理解为界面要做成的样子,对应着XAML文件创作的内容。
- ViewModel:用来实现业务逻辑。可以理解为是对Model的封装,通过一系列属性暴露Model的状态,提供给View进行显示。
其中的重点是View与ViewModel之间的交互,View中出现数据变化时会尝试修改绑定的目标,同样View执行命令时也会去寻找绑定的Command并执行。反过来,ViewModel在Property发生改变时会发个通知说“名字叫XXX的Property改变了,你们这些View中谁绑定了XXX也要跟着变啊!”,至于有没有View收到是不是做出变化也不关心。ViewModel中的Command脱离View就更简单了,因为Command在执行操作过程中操作数据时,根本不需要操作View中的数据,只需要操作ViewModel中的Property就可以了,Property的变化通过绑定就可以反映到View上。
下面实现一个小的加法计算器为例来学习一下MVVM
首先建立以下几个文件夹其中Bases放一些基类,比如NotifyBase就是放需要数据更改后发送通知的类的基类。
NotifyBase基类继承自INotifyPropertyChanged这个接口,按Alt Enter引用相应的名称空间(using System.ComponentModel;)再按Alt Enter实现接口。
为了方便使用,使用RaisePropertyChanged这个方法来对PropertyChanged进行封装,当属性的值发生改变时,来通知View。
同样我们需要一个CommandBase来做命令绑定,同样我们需要继承自ICommand这个接口,按Alt Enter引用相应的名称空间(using System.Windows.Input;)再按Alt Enter实现接口。
代码语言:javascript复制public event EventHandler CanExecuteChanged;// 当命令可执行状态发生改变时,可激发此事件来通知其他对象。
public bool CanExecute(object parameter)//在执行之前用来探知命令是否可被执行。
public void Execute(object parameter)//命令执行的方法。
这里用到Action和Func,相比delegate关键字,使用Action和Func会使代码更简洁。Action和Func两者的区别在于Action没有返回值,而Func有返回值。
新建MainWindow的ViewModel起名叫MainWindowViewModel类
继承自NotifyBase这个基类,并引入using MVVMDemo.Bases;这个命名空间
可以自己添加一个propn这个CodeSnippet(代码片段)
使用propn连续按两下tab键 简化写数据属性的代码 下面建Input1,Input2,Result三个数据属性。
接着写命令绑定 建一个命令属性AddCommand 以及委托具体的执行方法Add 以及在构造函数中实现Add与AddCommand之间得关联。
到此准备工作完成。
命令绑定不好理解,也不好用文字描述 感兴趣得小伙伴可以学习一下刘铁猛老师的深入浅出WPF视频 我也是按照这个视频整理的内容。
就这么简单!
作者简介:
曹言林:加入工控八余载,从事过单片机编程、控制柜接线、设备维修,PLC编程、上位机编程、MES实施。对各方面虽不是专家级别,也愿为工控圈添砖加瓦,贡献自己的一份力量。