CommunityToolkit是微软推出的轻量级工具包,它集成了现代、快速和模块化的 MVVM 库。
安装
在NuGet 工具箱上搜索CommunityToolKit进行下载
观测对象
ObservableObject
ObservableObject 是通过实现 INotifyPropertyChanged 和 INotifyPropertyChanging 接口可观察的对象的基类。 它可用作需要支持属性更改通知的各种对象的起点。
包含以下主要功能
它提供了对 INotifyPropertyChanged 和 INotifyPropertyChanging 的基本实现,从而公开 PropertyChanged 和 PropertyChanging 事件。
它提供了一系列 SetProperty 方法,这些方法可用于轻松设置继承自 ObservableObject 的类型中的属性值,并自动引发相应的事件。
它提供了 SetPropertyAndNotifyOnCompletion 方法,该方法与 SetProperty 类似,但能够设置 Task 属性并在分配的任务完成后自动引发通知事件。
它公开了 OnPropertyChanged 和 OnPropertyChanging 方法,这些方法可在派生类型中重写,以自定义引发通知事件的方式。
两种检测属性更新方式
方式一
OnPropertyChanged(nameof(Age));
private int age; public int Age { get { return age; } set { // 检测界面更新方法一 age = value; OnPropertyChanged(nameof(Age)); } }
方式二
private int age; public int Age { get { return age; } set { // 检测界面更新方法二 SetProperty(ref age, value); } }
ObservableValidator
ObservableValidator 是实现 INotifyDataErrorInfo 接口的基类,它支持验证向其他应用程序模块公开的属性。 它也继承自 ObservableObject,因此它还可实现 INotifyPropertyChanged 和 INotifyPropertyChanging。 它可用作需要支持属性更改通知和属性验证的各种对象的起点
包含以下主要功能:
它提供对 INotifyDataErrorInfo 的基本实现,从而公开 ErrorsChanged 事件和其他必要的 API。
它提供一系列额外的 SetProperty 重载(ObservableObject 基类提供的重载除外),这些重载提供在更新属性值之前自动验证属性和引发必要事件的功能。
它公开了许多 TrySetProperty 重载,这些重载类似于 SetProperty 但仅在验证成功时更新目标属性,并在出错时返回生成的错误以供进一步检查。
它公开了 ValidateProperty 方法,这对于手动触发对特定属性的验证非常有用,以防其值尚未更新,但其验证依赖于已更新的另一个属性的值。
它公开了 ValidateAllProperties 方法,这会自动执行对当前实例中所有公共实例属性的验证,前提是它们至少应用了一个 [ValidationAttribute]。
它公开了 ClearAllErrors 方法,该方法在重置绑定到用户可能需要再次填充的某个表单的模型时非常有用。
它提供许多构造函数,这些函数允许传递不同的参数来初始化将用于验证属性的 ValidationContext 实例。 使用可能需要其他服务或选项才能正常工作的自定义验证特性时,这尤其有用。
自定义验证方法
第一步创建属性
public class Form表单验证ViewModel : ObservableValidator { private string name; [Required(ErrorMessage = "不能为空")] // 必填的 name 不能为空 [MinLength(2, ErrorMessage = "最小长度为2")] // 最少长度为2 [MaxLength(10, ErrorMessage = "最大长度不能超过10")] // 最大长度不能超过10 public string Name { get { return name; } set { SetProperty(ref name, value, true); } } }
第二步在xaml中定义表单样式
<Window x:Class="ToolKit基本使用.Form" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:ToolKit基本使用" mc:Ignorable="d" Title="Form" Height="450" Width="800"> <!--自定义form表单验证--> <Window.Resources> <Style TargetType="TextBox"> <Setter Property="Validation.ErrorTemplate"> <Setter.Value> <ControlTemplate> <StackPanel Margin="0,30,0,0" Background="Red"> <TextBlock Text="{Binding [0].ErrorContent}"></TextBlock> </StackPanel> </ControlTemplate> </Setter.Value> </Setter> </Style> </Window.Resources> <Grid> <StackPanel> <TextBox Text="{Binding Name ,UpdateSourceTrigger=PropertyChanged}" Width="200" Height="40"></TextBox> <TextBox Width="200" Height="40"></TextBox> </StackPanel> </Grid> </Window>
第三步在CS后台文件绑定
public partial class Form : Window { public Form() { InitializeComponent(); this.DataContext = new Form表单验证ViewModel(); } }
效果
异步命令AsyncRelayCommand
AsyncRelayCommand和AsyncRelayCommand<T>是 ICommand 实现,它们扩展了RelayCommand提供的功能,并支持异步操作。
具有以下主要功能:
* 它们扩展了库中包含的同步命令的功能,并支持 `Task` 返回委托。
* 它们可以使用附加 `CancellationToken` 参数包装异步函数以支持取消,并公开 `CanBeCanceled` 和 `IsCancellationRequested` 属性以及 `Cancel` 方法。
* 它们公开可用于监视挂起操作进度的 `ExecutionTask` 属性,以及可用于检查操作完成时间的 `IsRunning` 属性。 这对于将命令绑定到 UI 元素(如加载指示器)特别有用。
* 它们实现 IAsyncRelayCommand 和 IAsyncRelayCommand<T>接口,这意味着 viewmodel 可以轻松地使用这些接口来公开命令,从而减少类型之间的紧密耦合。 例如,这样就可以轻松地将命令替换为公开相同公共 API 图面的自定义实现(如果需要)。
使用异步指令
// 异步任务指令 public class TaskViewModel:ObservableObject { private int num; public int Num { get { return num; } set { SetProperty(ref num, value); } } public TaskViewModel() { R2 = new AsyncRelayCommand<string>(F1); } public Task F1(string v) { Task t = new Task(() => { Thread.Sleep(1000); // 线程休眠 Num = 10; }); t.Start();// 开启任务 return t; } public AsyncRelayCommand<string> R2 { get; set; } // 异步指令回调函数时一个有返回值的回调,返回值类为Task类型 }
相关UI 代码:
<Window x:Class="ToolKit基本使用.TaskWinDow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:ToolKit基本使用" mc:Ignorable="d" Title="TaskWinDow" Height="450" Width="800"> <Grid> <StackPanel> <Label>对应的是TaskViewModel的属性和指令</Label> <Label Content="{Binding Num}"></Label> <Button Command="{Binding R2}" CommandParameter="3">touch me</Button> </StackPanel> </Grid> </Window>
源生成器
从版本 8.0 开始,MVVM 工具包包含全新的 Roslyn 源生成器,有助于在使用 MVVM 体系结构编写代码时大幅减少样板。 它们可简化需要设置可观察属性、命令等的方案。 如果不熟悉源生成器,可 在此处 阅读有关它们的详细信息。
这意味着,在编写代码时,MVVM 工具包生成器现在将负责在后台为你生成其他代码,因此无需担心。 然后,此代码将编译并包含在应用程序中,因此最终结果与手动编写所有额外代码完全相同,但不必执行所有这些额外工作!
不使用源生成器
private string _title; public string Title { get { return _title; } set { SetProperty(ref _title, value); } }
使用源生成器
[ObservableProperty] public string _name; [RelayCommand] public void HelloName() { Console.WriteLine("Hello"); }
学习网站
[CommunityToolkit.Mvvm 加速 MVVM 开发-CSDN博客](https://blog.csdn.net/qq_43562262/article/details/133611443)
官方文档
[MVVM 工具包简介 - Community Toolkits for .NET | Microsoft Learn](https://learn.microsoft.com/zh-cn/dotnet/communitytoolkit/mvvm/)