乘风破浪,遇见MVVM Toolkit官方社区首推MVVM框架,后UWP时代的拯救版MVVM框架
时间:2021-08-20
本文章向大家介绍乘风破浪,遇见MVVM Toolkit官方社区首推MVVM框架,后UWP时代的拯救版MVVM框架,主要包括乘风破浪,遇见MVVM Toolkit官方社区首推MVVM框架,后UWP时代的拯救版MVVM框架使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
什么是MVVM Toolkit
大家一说起WPF或者UWP能用的MVVM框架,肯定主流的推荐就是Prism和MVVMLight这两个,算是使用最广泛的,但是目前Prism已经不再支持UWP了,然后MVVMLight已经多年不更新了,那就玩完了?
不,官方社区套件(
Windows Community Toolkit
)挺身而出,带来了拯救版MVVM Toolkit这个MVVM框架
MVVM Toolkit
延续了MVVMLight
的风格,是一个轻量级的组件,而且它基于.NET Standard 2.0
,可用于UWP
, WinForms
, WPF
, Xamarin
, Uno
等多个平台。
相比它的前身 MVVMLight,它有以下特点:
- 更高:版本号更高,一出手就是7.0。
- 更快:速度更快,MVVM Toolkit从一开始就以高性能为实现目标。
- 更强:后台更强,MVVM Toolkit的全程是'Microsoft.Toolkit.Mvvm',根正苗红。
安装MVVM Toolkit
dotnet add package Microsoft.Toolkit.Mvvm
官方指导文档
https://docs.microsoft.com/zh-cn/windows/communitytoolkit/mvvm/introduction
using Microsoft.Toolkit.Mvvm;
官方指导示例
项目源码仓库
开发探索指引
ObservableObject
public class User : ObservableObject
{
private string name;
public string Name
{
get => name;
set => SetProperty(ref name, value);
}
}
RelayCommand
public class MyViewModel : ObservableObject
{
public MyViewModel()
{
IncrementCounterCommand = new RelayCommand(IncrementCounter);
}
private int counter;
public int Counter
{
get => counter;
private set => SetProperty(ref counter, value);
}
public ICommand IncrementCounterCommand { get; }
private void IncrementCounter() => Counter++;
}
<Page
x:Class="MyApp.Views.MyPage"
xmlns:viewModels="using:MyApp.ViewModels">
<Page.DataContext>
<viewModels:MyViewModel x:Name="ViewModel"/>
</Page.DataContext>
<StackPanel Spacing="8">
<TextBlock Text="{x:Bind ViewModel.Counter, Mode=OneWay}"/>
<Button
Content="Click me!"
Command="{x:Bind ViewModel.IncrementCounterCommand}"/>
</StackPanel>
</Page>
AsyncRelayCommand
public MyViewModel()
{
DownloadTextCommand = new AsyncRelayCommand(DownloadTextAsync);
}
public IAsyncRelayCommand DownloadTextCommand { get; }
private async Task<string> DownloadTextAsync()
{
await Task.Delay(3000); // Simulate a web request
return "Hello world!";
}
<Page.Resources>
<converters:TaskResultConverter x:Key="TaskResultConverter"/>
</Page.Resources>
<StackPanel Spacing="8">
<TextBlock>
<Run Text="Task status:"/>
<Run Text="{x:Bind ViewModel.DownloadTextCommand.ExecutionTask.Status, Mode=OneWay}"/>
<LineBreak/>
<Run Text="Result:"/>
<Run Text="{x:Bind ViewModel.DownloadTextCommand.ExecutionTask, Converter={StaticResource TaskResultConverter}, Mode=OneWay}"/>
</TextBlock>
<Button
Content="Click me!"
Command="{x:Bind ViewModel.DownloadTextCommand}"/>
<muxc:ProgressRing
HorizontalAlignment="Left"
IsActive="{x:Bind ViewModel.DownloadTextCommand.IsRunning, Mode=OneWay}"/>
</StackPanel>
Messenger
// Create a message
public class LoggedInUserChangedMessage : ValueChangedMessage<User>
{
public LoggedInUserChangedMessage(User user) : base(user)
{
}
}
// Register a message in some module
WeakReferenceMessenger.Default.Register<LoggedInUserChangedMessage>(this, (r, m) =>
{
// Handle the message here, with r being the recipient and m being the
// input messenger. Using the recipient passed as input makes it so that
// the lambda expression doesn't capture "this", improving performance.
});
// Send a message from some other module
WeakReferenceMessenger.Default.Send(new LoggedInUserChangedMessage(user));
ObservableRecipient
public class MyViewModel : ObservableRecipient, IRecipient<LoggedInUserRequestMessage>
{
public void Receive(LoggedInUserRequestMessage message)
{
// Handle the message here
}
}
参考
原文地址:https://www.cnblogs.com/taylorshi/p/15165914.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一起来学matlab-matlab学习笔记8 基本绘图命令_5 初级二维绘图/交互式绘图
- PHP实现页面跳转的几种方法
- 一起来学matlab-matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色
- 一起来学matlab-matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象
- PHP 如何阻止用户上传成人照片或者裸照
- 一起来学matlab-字符串操作 10_4 MATLAB中的字符串表示
- 一起来学演化计算-matlab优化函数fminunc
- 一起来学matlab-matlab学习笔记10 10_1一般运算符
- 每日手撕一道算法题-20. 有效的括号
- 一起来学matlab-数组取值 MATLAB中的字符串符号
- 递归解决遍历问题
- PHP中的include和require
- 一起来学matlab-matlab学习笔记10 10_2一般操作符和数据显示格式
- 一起来学matlab-matlab学习笔记10 10_3关系运算符和逻辑运算符
- 一篇文章学懂Shell脚本,最简明的教程在这里