前面讲过,MVVM 架构是一种设计思想,不仅适用于WPF,MAUI,还有其他的C#开发同样都适用。而MVVM框架除了MVVM Toolkit,还有MVV MLight (停止维护),Prism等等,本章小节主要学习Toolkit.
- 是一种轻量级且开源免费的 MVVM 框架
- 由微软开发维护
- ObservableObject 所有对象属性必须继承自该类型,并且提供了 SetProperty 方法,使用 SetProperty 方法自动通知前端属性发生了改变。注意,属性值不变时,该方法SetProperty 不会触发,属性值变化时才会触发。
- RelayCommand 前端页面绑定命令的点击事件
- AsyncRelayCommand 前端页面绑定命令的异步点击事件,返回值是Task
- WeakReferenceMessenger 消息订阅
- ObservableRecipient 消息订阅
- IRecipient 消息订阅
1. 创建完整的属性快捷方式是输入 propfull 按两次Tab
2. 必须设置 SetProperty 方法。当属性值发生改变时,通知前端。
原生的写法
第三方MVVM 框架中ObservableObject是实现了INotifyPropertyChanged和INotifyPropertyChanging接口基类。 所以原生写法和第三方写法原理差不太多。
同步方法,也可以改变异步的方式
- 使用 Binding 是一种固定语法,绑定后台的属性
- 绑定模式,model是一个(mode)是枚举的类型,一共有5个种
2.1 OneWay(源变就更新目标属性)
2.2 TwoWay(源变就更新目标并且目标变就更新源)
2.3 OneTime(只根据源来设置目标,以后都不会变)
2.4 OneWayToSource(与OneWay相反)
2.5 Default 默认(可以单向或双向,是靠被值定的源或目标是否有get或set来指定的)- UpdateSourceTrigger属性,由于WPF中,对于TextBox,除了Text属性之外的所有属性源会随属性的改变而立即更新;但是Text属性不一样,它只有在目标元素失焦后才更新。所以要想让TextBox中的变化立即传递到源,就需要设置UpdateSourceTrigger 来控制。如果不设置该属性,后台取到的值是空值。
参考:文献1,文献2
// string 发布的消息类型
WeakReferenceMessenger.Default.Sen("发布出去的就是我");
5.2.1 通过匿名方法的方式订阅发布的消息
//订阅
WeakReferenceMessenger.Default.Register(this,method);
//string 就是订阅时传过来的数据类型
// this 指向当前使用的类
//订阅方法
public void method(object obj,string msg){
// msg 接受到的数据
}
注意:发布的消息类型中,如果发布的是string 类型,所有订阅了string 类型的消息,都能接收到所有发布的string 类型的消息。
5.2.2 通过指定 token 的方式发布指定的消息
WeakReferenceMessenger.Default.Send("发送的消息", "token");
5.2.3 并且订阅时只接收固定token 发布的消息
//订阅,第二个 string 就是 token
WeakReferenceMessenger.Default.Register(this,"token",method);
//string 就是订阅时传过来的数据类型
// this 指向当前使用的类
//订阅方法
public void method(object obj,string msg){
// msg 接受到的数据
}
WeakReferenceMessenger.Default.Sen("发布消息");
注意,想要消息能被订阅,要把IsActive 赋值 为true 才行
例如,当前我这个订阅的消息,只想定阅某个类的,不想让它订阅所有的string 类型的消息
发布可以这样写
WeakReferenceMessenger.Default.Send<对象类>();
订阅可以这样指定
这样就能订阅到指定对象发布消息内容了,而不是全部都会订阅到。
1.为什么要用到ioc,比如当前我们要写一个数据接口供页面调数据啥的,反正就是一些接口数据服务,数据操作等等
首先要 Nuget 安装一个库,这个库是能支持ioc 注入的库
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();
services.AddScoped();
return services.BuildServiceProvider();
}
}
内容出自:【2022全网首发】WPF应用开发中的轻型级MVVM框架-MVVM Toolkit 教程后附源码 B0560_哔哩哔哩_bilibili
建议大家还是直接看视频好,毕竟我只是记录一下学习的过程。