MVVM——CommunityToolKit第三方详情

news2024/9/20 8:53:15

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/)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1858526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单门户上集成多种数据库查询入口

&#xff08;作者&#xff1a;陈玓玏&#xff09; 开源项目&#xff0c;欢迎star哦&#xff0c;https://github.com/tencentmusic/cube-studio 在一家公司&#xff0c;我们通常会有多种数据库&#xff0c;每种数据库因为其特性承担不同的角色&#xff0c;比如mysql这种轻量…

红队内网攻防渗透:内网渗透之内网对抗:横向移动篇域控系统提权NetLogonADCSPACKDC永恒之蓝CVE漏洞

红队内网攻防渗透 1. 内网横向移动1.1 横向移动-域控提权-CVE-2020-1472 NetLogon1.2 横向移动-域控提权-CVE-2021-422871.3 横向移动-域控提权-CVE-2022-269231.4 横向移动-系统漏洞-CVE-2017-01461.5 横向移动-域控提权-CVE-2014-63241. 内网横向移动 1、横向移动-域控提权-…

LeetCode.32最长有效括号详解

问题描述 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 解题思路1 有效的括号字符串意味着每一个左括号 ( 都可以找到一个相匹配的右括号 )。栈可以帮助我们追踪尚未匹配的括号&#xff0c;并有效地处理…

缓存雪崩、穿透、击穿的概念和如何避免

雪崩 概念 高并发请求多个key&#xff0c;此时多个key同时失效、不在缓存中&#xff0c;请求全部打到数据库&#xff0c;使数据库无法处理这么多的连接&#xff0c;导致数据库死机 如何避免 防止多个key同时过期&#xff0c;设置随机的过期时间不设置过期时间&#xff0c;有…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 08:剩下的就是态度问题

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

chatglm系列知识

一、目录 chatglm 是什么语言模型与transformer decoder 的区别解释prefix LM与Cause LMchatglm&#xff08;prefix LM&#xff09;与decoder-only LM 核心区别glm 架构chatglm 预训练方式chatglm 微调chatglm与chatglm2、chatglm3的区别chatglm 激活函数采用gelu, 为什么chat…

融资融券账户与普通账户有何区别?一文读懂为什么要开通两融账户

01 融资融券账户与普通账户的区别 1、开通条件不同&#xff1a; ①普通账户&#xff1a;开户的门槛低&#xff0c;一般年满18岁以上就能开通。&#xff08;70岁以上需要临柜开户&#xff09;。 ②融资融券&#xff1a;融资融券的准入门槛相对较高&#xff0c;需要满足以下几…

SQLite3的使用

14_SQLite3 SQLite3是一个嵌入式数据库系统&#xff0c;它的数据库就是一个文件。SQLite3不需要一个单独的服务器进程或操作系统&#xff0c;不需要配置&#xff0c;这意味着不需要安装或管理&#xff0c;所有的维护都来自于SQLite3软件本身。 安装步骤 在Linux上安装SQLite…

python桌面应用

py文件 import osimport wx import wx.html2class MyFrame(wx.Frame):def __init__(self, parent):wx.Frame.__init__(self, parent, title"启动啦", size(1000, 700))# 创建一个Web视图组件self.browser wx.html2.WebView.New(self)# 加载本地HTML文件# self.brow…

WebFlux 和 Spring Security 会碰出哪些火花?

项目创建成功后&#xff0c;我们添加一个接口&#xff0c;用来获取登录用户信息&#xff0c;如下&#xff1a; RestController public class UserController { GetMapping(“/user”) public Mono getCurrentUser(Mono principal) { return principal; } } 注意我们的返…

【Leetcode每日一题】 01背包 - DP41 【模板】01背包(难度⭐⭐)(80)

1. 题目解析 题目链接&#xff1a;DP41 【模板】01背包 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 第一问&#xff1a;不超过总体积的背包问题 1. 状态表示 dp[i][j] 表示&#xff1a;从前 i 个物品中挑选&…

android adb常用命令集

1、系统调试 #adb shell&#xff1a;进入设备的 shell 命令行界面&#xff0c;可以在此执行各种 Linux 命令和特定的 Android 命令。 #adb shell dumpsys&#xff1a;提供关于系统服务和其状态的详细信息。 #adb logcat&#xff1a;实时查看设备的日志信息。可以使用过滤条件来…

Arduino称重传感器和 HX711 放大器(数字秤)

Arduino称重传感器和 HX711 放大器&#xff08;数字秤&#xff09; Arduino with Load Cell and HX711 Amplifier (Digital Scale) In this guide, you’ll learn how to create a digital scale with the Arduino using a load cell and the HX711 amplifier. First, you’l…

二叉树-左叶子之和(easy)

目录 一、问题描述 二、解题思路 三、代码实现 四、刷题链接 一、问题描述 二、解题思路 此题属于树遍历的简单题&#xff0c;用递归深度遍历的方式&#xff0c;当遇到左叶子结点(在递归函数中加上一个判断当前结点是左结点还是右结点的标记位)&#xff0c;此时加上当前结点…

ONLYOFFICE 桌面编辑器 8.1:全新升级,助您轻松高效处理办公文档

ONLYOFFICE 桌面编辑器 一、前言二、轻松编辑器 PDF 文件三、用幻灯片版式快速修改幻灯片四、无缝切换文档编辑、审阅和查看模式五、改进从右至左语言的支持 & 新的本地化选项六、版本 8.1&#xff1a;其他新功能七、ONLYOFFICE 官网&#xff1a;https://www.onlyoffice.co…

OnlyOffice8.1新功能测评

一、导语 时隔四个月&#xff0c;OnlyOffice推出了8.1版本。 四个月过去&#xff0c;笔者的项目也接近尾声&#xff0c;在项目过程中还把OnlyOffice插件推荐给了项目组&#xff0c;希望官方多出好用功能&#xff0c;造福我们广大项目O(∩_∩)O 回归正题&#xff0c;与前几个…

【数据结构与算法】之(数据结构绪论篇)(一)溢彩色

总而言之&#xff1a;《数据结构》是介于数学、计算机硬件和计算机软件三者之间的一门核心课程 1-1.抽象数据类型&#xff1a; 一个数学模型及定义在该模型上的一组操作&#xff1b;抽象数据类型体现了程序设计中问题分解&#xff0c;抽象和信息隐藏的特性。 抽象&#xff1a…

最新《pvz植物大战僵尸杂交版》整合安装包,全面支持Android、ios、Windows,附教程!

今天&#xff0c;阿星要聊聊最近全网大火的一款老游戏——《植物大战僵尸》杂交版。 虽然它不是什么3A大作&#xff0c;但在阿星的心里&#xff0c;它永远是那个让人回味无穷的经典。记得十年前&#xff0c;阿星和大多数玩家一样&#xff0c;玩的都是盗版。那时候的《植物大战…

【人机交互 复习】第1章 人机交互概述

人机交互的知识点碎&#xff0c;而且都是文字&#xff0c;过一遍脑子里什么都留不下&#xff0c;但是背时间已经来不及了&#xff0c;最好还是找题要题感吧&#xff0c;加深印象才是做对文科的关键 一、概念 1.人机交互&#xff08;Human-Computer Interaction,HCI)&#xff1…