WPF:MVVM的由来与属性绑定的过程
  lZfXAzNKAdzc 23天前 50 0

WPF:MVVM的由来与属性绑定的过程

1、MVVM

(1)MVVM是什么?

​ MVVM(Model-View-ViewModel)是一种软件架构设计模式MVVM模式。有助于分离应用程序的业务逻辑和用户界面层,使得开发过程更易于管理,同时也便于单元测试。

image-20240821184048203

Model?

现实世界中对象的抽象结果。

View?

View=UI。

View Model?

ViewModel=Model for View。

View 与 View Model之间的沟通:传递数据:数据属性 传递操作:命令属性

(2)为什么要使用MVVM?

  • 可测试性:由于业务逻辑被封装在ViewModel中,这使得编写单元测试变得更容易。
  • 解耦:View和Model之间通过ViewModel间接通信,使得它们彼此独立,易于单独修改和维护。
  • 可维护性:清晰的分层结构使得代码更易于理解和维护。

2、数据绑定

现在我们做一个实验,实现一个简单的加法,通过MVVM去实现。

image-20240821185036615

从图中可以看出,有3个数据属性和2个命令属性。

先创建好各层文件夹如下:

image-20240821185305645

对于数据属性,我们先创建一个NotificationObject类,去继承INotifyPropertyChanged这个接口,这个接口用来是实现UI与数据属性之间双向绑定的

image-20240821190221001

对于命令属性,我们先创建一个DelegateCommand类,继承ICommand这个接口。

image-20240821190910144

ViewModel里面的代码如下:

image-20240821191133811

结果如下:

image-20240821191259007

3、分析

如何执行数据属性呢?(ViewModel与View之间双向交互)

数据绑定的过程,INotifyPropertyChanged里面接口是用来干嘛的?

当我们在UI层里面输入1时(此时对应的值已经传到了Input1了),这个时候会执行属性对应的Set里面的方法

image-20240821191524420

然后执行方法里面的事件,将这个属性名字传递到UI,然后UI绑定的对应的属性就随之改变

image-20240821191735106

也就是说:Input1和Inpu2我们只是通过UI去传值,所以我们并不需要去执行RaisePropertyChanged这个方法。于是,当我注释掉里面的RaisePropertyChanged方法时,经过调试与实验,依然可以显示结果。这个过程是从View到ViewModel的过程。

再来说Input3,这个为什么不可以去掉RaisePropertyChanged这个方法呢?因为当我们去执行命令后,Input3在ViewModel里面的值进行了改变,然后通过事件触发通知UI,传递给相对应的属性名字,这样UI层的值就改变了。这个过程是View Model到View的过程。

如何执行命令属性呢?(View到ViewModel)

我们知道,在MainWindow里面我们需要将xaml的上下文与View Model绑定

image-20240821193016065

然而在创建的ViewModel对象里面,就执行了这个命令属性吗?

image-20240821193148101

于是,经过调试,我发现在new完后并没有去触发委托里面的Add方法,这是为什么呢?

在初始化阶段,AddCommand被创建并设置好执行的动作(即Add方法),但这并不意味着Add方法被立即执行。只有当用户与UI进行交互时(比如点击按钮),AddCommand才会被触发,从而执行Add方法。
这里注意,命令属性的绑定方法:

image-20240821193627815

数据属性的绑定方法,比如文中的TextBox:

image-20240821193719987

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 23天前 0

暂无评论

推荐阅读
  2fqsT8Yu1xAt   3天前   10   0   0 .NET
  2fqsT8Yu1xAt   2天前   19   0   0 .NET
lZfXAzNKAdzc