前面讲过 MVVM 架构是一种设计思想,不仅适用于WPF,MAUI,还有其他的C#开发同样都适用。而MVVM框架除了MVVM Toolkit,还有MVV MLight (停止维护),Prism等等,本章小节主要学习Toolkit.

1. MVVM Toolkit 框架特点

  • 是一种轻量级且开源免费的 MVVM 框架
  • 由微软开发维护

2. MVVM Toolkit  常用的基本类型

  • ​ObservableObject 所有对象属性必须继承自该类型,并且提供了 SetProperty 方法,使用 SetProperty 方法自动通知前端属性发生了改变。注意,属性值不变时,该方法SetProperty 不会触发,属性值变化时才会触发。
  • RelayCommand  前端页面绑定命令的点击事件
  • AsyncRelayCommand  前端页面绑定命令的异步点击事件,返回值是Task
  • WeakReferenceMessenger 消息订阅
  • ObservableRecipient 消息订阅
  • ​IRecipient 消息订阅

3. 接下来介绍在WPF 如何使用

3.1  新建一个WPF 项目,Nuget 搜索安装 Microsoft.Toolkit.Mvvm

4. 实现一个功能,页面点击按钮时,把 TextBox 的值传到后台页面,并且把该值绑定回来前端页面中。

4.1 首先建一个类,继承自 ObservableObject 类

1. 创建完整的属性快捷方式是输入 propfull 按两次Tab

2.  必须设置 SetProperty 方法。当属性值发生改变时,通知前端。

原生的写法

第三方MVVM 框架中ObservableObject是实现了INotifyPropertyChanged和INotifyPropertyChanging接口基类。 所以原生写法和第三方写法原理差不太多。

4.2 在 S71200ViewModel 类中,添加一个命令,并且进行实例化。

同步方法,也可以改变异步的方式

4.3 前端组件页面

  1. 使用 Binding 是一种固定语法,绑定后台的属性
  2. 绑定模式,model是一个(mode)是枚举的类型,一共有5个种
    2.1 OneWay (源变就更新目标属性)
    2.2 TwoWay(源变就更新目标并且目标变就更新源)
    2.3 OneTime(只根据源来设置目标,以后都不会变)
    2.4 OneWay ToSource(与 OneWay 相反)
    2.5 Default 默认(可以单向或双向,是靠被值定的源或目标是否有 get 或set来指定的)
  3. UpdateSourceTrigger属性,由于 WPF中,对于TextBox,除了Text属性之外的所有属性源会随属性的改变而立即更新;但是Text属性不一样,它只有在目标元素失焦后才更新。所以要想让TextBox中的变化立即传递到源,就需要设置UpdateSourceTrigger 来控制。如果不设置该属性,后台取到的值是空值。

参考: 文献1 文献2

4.4 把S71200ViewModel 与页面进行关联

4.5 测试验证,点击页面按钮时,触发该命令。

4.6 另外一种取前端页面值的方式,但这种方式与MVVM 无关,也能取到TextBox 输入的值,

4.7 按钮事件的原生实现

4.8 后台获取值的方式,打开.cs类文件

4.9  Address 是TextBox定义的Name,随意起的名称。后台去获取前台输入的值。

5. 消息定阅 WeakReferenceMessenger

5.1 如何发布消息

// string 发布的消息类型
WeakReferenceMessenger.Default.Sen<string>("发布出去的就是我");

5.2 如何订阅发布消息

5.2.1 通过匿名方法的方式订阅发布的消息

WeakReferenceMessenger.Default.Register<string>(this,method); //string 就是订阅时传过来的数据类型 // this 指向当前使用的类 //订阅方法 public void method(object obj,string msg){ // msg 接受到的数据

注意:发布的消息类型中,如果发布的是string 类型,所有订阅了string 类型的消息,都能接收到所有发布的string 类型的消息。

5.2.2 通过指定 token 的方式发布指定的消息

WeakReferenceMessenger.Default.Send<string,string>("发送的消息", "token");

5.2.3 并且订阅时只接收固定token 发布的消息

//订阅,第二个 string 就是 token
WeakReferenceMessenger.Default.Register<string,string>(this,"token",method);
//string 就是订阅时传过来的数据类型
// this 指向当前使用的类
//订阅方法
public void method(object obj,string msg){
// msg 接受到的数据

 6. 消息定阅 ObservableRecipient,​IRecipient 

6.1 在要实现消息订阅或发布的类中,实现ObservableRecipient 类型和IRecipient  接口

 6.2 当前我发布了一个string 类型的消息

WeakReferenceMessenger.Default.Sen<string>("发布消息");

6.3 那么实现的方法就能获取到已发布的string 类型的消息

注意,想要消息能被订阅,要把IsActive 赋值 为true 才行

6.4 消息定阅和发布,也可以通过不同的对象进行发布和订阅。

例如,当前我这个订阅的消息,只想定阅某个类的,不想让它订阅所有的string 类型的消息

发布可以这样写

WeakReferenceMessenger.Default.Send<对象类>();

订阅可以这样指定

这样就能订阅到指定对象发布消息内容了,而不是全部都会订阅到。

 7. IOC 注入,目前这个框架没有提供,不过可以通过别的方式进行ico处理

1.为什么要用到ioc,比如当前我们要写一个数据接口供页面调数据啥的,反正就是一些接口数据服务,数据操作等等

7.1 例如,当前建立一个接口服务类,用来进行数据操作

7.2 然后类里面,通过注入的方式,使用到该接口进行数据操作

 7.3 如果要同上面一样,在wpf 使用ioc 注入 ,那应该要这样处理。

首先要 Nuget 安装一个库,这个库是能支持ioc 注入的库

7.4 安装完成后,需要进行初始化。主要是这种处理ioc 的库,它的生命周期必须要跟我们应用程序同步,所以需要在应用程序初始化的时候,这个ioc 容器也要初始化

 7.5  初始化的方法里面,进行接口的注册的

 7.6 这样写之后,由于之前使用的mvvm 中进行初始化绑定时,之前是这样子写

this.DataContext=new MainWindowViewModel();

 但现在需要改成这样子,需要把这个MainWindowViewModel 注册到ioc 容器中

 然后初始化绑定时变成这样子,通过Services 来获取

this.DataContext=App.Current.Services.GetService(typeof(MainWindowViewModel));

容器初始化代码

  public partial class App : Application
        public App()
            Services = GetService();
        public new static App Current => (App)(Application.Current);
        public IServiceProvider Services {get;}
        public static IServiceProvider GetService()
            var services = new ServiceCollection();
            services.AddSingleton<IValueInterface, ValueInterface>();
            services.AddScoped<MainWindowViewModel>();
            return services.BuildServiceProvider();

内容出自:【2022全网首发】WPF应用开发中的轻型级MVVM框架-MVVM Toolkit 教程后附源码 B0560_哔哩哔哩_bilibili

建议大家还是直接看视频好,毕竟我只是记录一下学习的过程。 

注意发布的消息类型中,如果发布的是string类型,所有订阅了string类型的消息,都能接收到所有发布的string类型的消息。4.实现一个功能,页面点击按钮时,把TextBox的值传到后台页面,并且把该值绑定回来前端页面中。4.5另外一种取前端页面值的方式,但这种方式与MVVM无关,也能取到TextBox输入的值,4.8Address是TextBox定义的Name,随意起的名称。4.2在S71200ViewModel类中,添加一个命令,并且进行实例化。...
至于啥是MVVM在此不再赘述,可以参考这位大神写的博客 : http://www.cnblogs.com/durow/p/4853729.html 在此只是搭建一个简单的框架, 仅供学习参考, 欢迎转载. 如有任何问题,意见或建议欢迎随时批评指正. 如有侵权请及时联系删除,谢谢. 包含的基础类参考如下截图,具体类的作用我会随着代码展开做简短的解释. 类图参考: 首先我创建了三个文...
1. 什么是 MVVM Toolkit 模型-视图-视图模型 (MVVM) 是用于解耦 UI 代码和非 UI 代码的 UI 体系结构设计模式。 借助 MVVM,可以在 XAML 中以声明方式定义 UI,并使用数据绑定标记将 UI 链接到包含数据和命令的其他层。 微软虽然提出了 MVVM,但又没有提供一个官方的 MVVM 库(多年前有过 Prism,但已经离家出走了)。每次有人提起 MVVM 库,有些人会推荐 Prism(例如我),有些人会推荐 MVVMLight。可是现在 Prism 已经决定不再支持
<ItemGroup> <PackageReference Include="DryIoc.dll" Version="4.8.6" /> <PackageReference Include="Microsoft.Toolkit.Mvvm" Version="7.1.2" /> </ItemGroup> 添加 Vi 命名控件:Microsoft.Toolkit.Mvvm.ComponentModel 程序集:Microsoft.Toolkit.Mvvm.dll 包:Microsoft.Toolkit.MvvmObservableRecipient类型是可监视对象(Observable objects)的一个基类,这些对象扮演着消息接收者的角色。ObservableRecipient类是ObservableObject的拓展,它也提供了使用IMessenger类型的内置支持。 继承关系: Object→O Lee Sharp: 在XAML中,TargetType="{x:Type ListBoxItem}"和TargetType="ListBoxItem"实际上是等价的。 在早期的.NET Framework版本中,必须使用{x:Type ListBoxItem}的形式来指定类型,因为XAML解析器无法直接将字符串"ListBoxItem"转换为ListBoxItem类型。这是因为XAML解析器需要知道"ListBoxItem"是一个类型,而不是一个字符串。 但是在较新的.NET Framework版本中,XAML解析器已经可以自动将"ListBoxItem"识别为一个类型,因此可以直接写成TargetType=“ListBoxItem”。 Wpf 使用 Prism 实战开发Day02 Feng_jin233: 博主写的很棒,支持!我前一段也敲了这个项目,看着博主的记录重温,很有收获表情包 Wpf 使用 Prism 实战开发Day02 Feng_jin233: “是不是工作不努力了”紧贴时事,xsl Wpf 使用 Prism 实战开发Day21 别用Prism,用Community mvvm toolkit 香1000倍 Vue3+Element-Plus 实现点击左侧菜单时显示不同内容组件展示在Main区域功能 二九 QW~_~: 请问你一登陆进去显示的welcome是写在哪里的