前面讲过
,
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 前端组件页面
-
使用 Binding 是一种固定语法,绑定后台的属性
-
绑定模式,model是一个(mode)是枚举的类型,一共有5个种
2.1 OneWay
(源变就更新目标属性)
2.2 TwoWay(源变就更新目标并且目标变就更新源)
2.3 OneTime(只根据源来设置目标,以后都不会变)
2.4
OneWay
ToSource(与
OneWay
相反)
2.5 Default 默认(可以单向或双向,是靠被值定的源或目标是否有
get
或set来指定的)
-
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:
Wpf 使用 Prism 实战开发Day02
Feng_jin233:
Wpf 使用 Prism 实战开发Day02
Feng_jin233:
Wpf 使用 Prism 实战开发Day21
Vue3+Element-Plus 实现点击左侧菜单时显示不同内容组件展示在Main区域功能 二九
QW~_~: