WPF进阶之MVVM教程(一)

2022-11-14 19:31:45 浏览数 (1)

自写了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实施。对各方面虽不是专家级别,也愿为工控圈添砖加瓦,贡献自己的一份力量。

0 人点赞