[.NET/WPF] CommunityToolkit.Mvvm 异步指令

news/2024/9/12 17:35:51/

我们在开发中, 经常会有这样的需求:

  1. 点击按钮后, 进行一些耗时的工作
  2. 工作进行时, 按钮不可再次被点击
  3. 工作进行时, 会显示进度条, 或者 “加载中” 的动画

RelayCommand

CommunityToolkit.Mvvm 中的 RelayCommand 除了支持最简单的同步方法, 还支持以 Task 作为返回值的异步方法, 当我们为这样的异步方法标记上 RelayCommand 特性时, 它会生成一个对应的异步指令.

  1. 指令在执行时, 主要逻辑会在后台, 而不是运行在 UI 线程中. 具体可以参考 “异步和异步的线程切换”
  2. 指令在执行时, CanExecute 会变为 false, 此时使用该 Command 的 Button 或者其他控件, 也会变成 ‘被禁用’ 的状态.
  3. 如果方法参数中包含一个 CancellationToken, 那么这个任务同样可以被取消. 只需要你方法内部有正确实现 “取消执行” 的逻辑就没问题.

下面是一个例子.

主窗体代码:

<Window x:Class="LearnMvvm.MainWindow"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:LearnMvvm"xmlns:vm="clr-namespace:LearnMvvm.ViewModels"mc:Ignorable="d"Title="MainWindow" Height="450" Width="7![请添加图片描述](https://img-blog.csdnimg.cn/65ddbab8f917458bbfd40ebdb6bb6d16.gif)
00"><Window.DataContext><vm:MainViewModel/></Window.DataContext><Grid><StackPanel Margin="50"><Button Command="{Binding DoSomethingCommand}">Do something</Button><Button Command="{Binding CancelDoSomethingCommand}" Margin="0 5 0 0">Cancel</Button><ProgressBar Margin="0 10 0 0" Height="15" Value="{Binding Progress}"/></StackPanel></Grid>
</Window>

后台 ViewModel

public partial class MainViewModel : ObservableObject
{[ObservableProperty]private int progress;[RelayCommand]public async Task DoSomething(CancellationToken token){for (int i = 0; i <= 100; i++){if (token.IsCancellationRequested)return;await Task.Delay(100);Progress = i;}}[RelayCommand]public void CancelDoSomething(){DoSomethingCommand.Cancel();}
}

效果:
演示
取消执行

在 CommunityToolkit.Mvvm 中, 支持以下样式的 RelayCommand 签名:

  • void 方法名() 无参同步指令
  • void 方法名(类型 参数名) 有参同步指令
  • Task 方法名(), 无参, 不支持取消的异步指令
  • Task 方法名(类型 参数名) 有参, 不支持取消的异步指令
  • Task 方法名(CancellationToken token) 无参, 支持取消的异步指令
  • Task 方法名(类型 参数名, CancellationToken token) 有参, 支持取消的异步指令

http://www.ppmy.cn/news/1052339.html

相关文章

pr剪辑工具绿色版本

免费提供 提取码: 402s Pr提供了采集、剪辑、调色、美化音频、字幕添加、 输出、DVD刻录等一整套流程&#xff0c; 并和其他Adobe 软件高效集成&#xff0c;使您足以完成在编辑、 制作、工作上遇到的所有挑战&#xff0c;满足您创建高质量作品的要求。 Pr的版本选择 常用…

【云原生】3分钟快速在Kubernetes1.25部署Prometheus2.42+Grafana9.5.1+Alertmanager0.25

文章目录 1、简介2、GitHub地址3、环境信息4、安装5、访问Grafana1、简介 Prometheus-operator帮助我们快速创建Prometheus+Grafana+Alertmanager等服务,而kube-prometheus更加完整的帮助我们搭建全套监控体系,这包括部署多个 Prometheus 和 Alertmanager 实例, 指标导出器…

微信开发之一键修改群聊备注的技术实现

修改群备注 修改群名备注后&#xff0c;如看到群备注未更改&#xff0c;是手机缓存问题&#xff0c;可以连续点击进入其他群&#xff0c;在点击进入修改的群&#xff0c;再返回即可看到修改后的群备注名&#xff0c;群名称的备注仅自己可见 请求URL&#xff1a; http://域名地…

经济萧条下,RPA投入应该被“牺牲”掉吗?

近期有观点认为&#xff0c;在经济环境不佳的情况下&#xff0c;RPA&#xff08;机器人流程自动化&#xff09;转型不应该被公司考虑。这一观点主要基于经济状况不佳导致公司资金紧张&#xff0c;因此应当停止外部寻找RPA公司进行相关项目。然而&#xff0c;这一观点忽略了RPA转…

python 打印沁园春 雪 居中对齐 文本对齐

以下是python 中使用 DebugInfo 模块居中对齐打印《沁园春・雪》的效果 引入模块 pip install DebugInfopython代码 # -*- coding:UTF-8 -*-# region 引入必要依赖 from DebugInfo.DebugInfo import * # endregion诗文 沁园春 雪 作者: 毛主席 北国风光&#xff0c;千里冰封…

智慧健康杂志智慧健康杂志社智慧健康编辑部2023年第15期目录

智慧医疗 医疗信息化 提高病案首页填写质量&#xff0c;体现病案信息利用价值 张明芳; 1-4 经支气管镜检查联合针吸活检术在肺癌诊断中的临床应用价值 邱洪亮; 5-8 高频超声对距腓前韧带损伤的诊断价值 梁劲松;叶绮婷;曹肖维; 9-12《智慧健康》投稿邮箱&#xff1a…

【严重】Coremail 远程命令执行漏洞

漏洞描述 Coremail是广东盈世计算机科技有限公司推出的一款大型企业邮件系统。 在 Coremail XT5/XT6 版本中&#xff0c;邮件处理功能存在溢出风险&#xff0c;攻击者构造恶意邮件&#xff0c;向任意邮箱地址发送该恶意邮件&#xff0c;当服务器处理邮件时&#xff0c;会触发…

第五周周报

周报 日期&#xff1a;2023/08/14 ~ 2023/08/20 一、本周回顾 本周我学习了两个主要的知识点&#xff0c;分别是快速排序算法和Java面向对象编程。以下是我对这两个知识点的详细总结&#xff1a; 1. 快速排序算法 快速排序是一种高效的排序算法&#xff0c;它基于分治思想。…

3D虚拟数字人定制及数字人影片制作方案

在新消费大环境下&#xff0c;各行业正在向着数字化方向发展&#xff0c;数字人是行业进入数字化的主要入口&#xff0c;因此“数字人品牌”的营销模式不断出现于市场&#xff0c;为何品牌偏爱3D虚拟数字人定制&#xff1f; 因为数字人随着惯性动作捕捉技术的应用&#xff0c;成…

【使用Node.js搭建自己的HTTP服务器】

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

【算法日志】动态规划刷题:路径数问题(day34)

代码随想录刷题60Day 目录 前言 不同路径 不同路径(2) 前言 今天的动态规划题与昨天的题很类似&#xff0c;只不过今天的题是在二维上讨论&#xff0c;难度上略有提升。 不同路径 int uniquePaths(int m, int n) {vector<int> dp(n 1, 1);for (int i 1; i < m; …

记录某一次演讲

大家好&#xff0c;我是繁依&#xff0c;是一名软件工程的学生。很高兴能站在这里&#xff0c;与大家分享一下自己日常数据分析学习的经验。首先&#xff0c;我先来介绍一下自己常用的学习资源和工具&#xff0c;学习平台及资源有哔哩哔哩、掘金小册、和鲸社区、飞桨社区等 常…

优化学习体验是在线培训系统的关键功能

在线培训系统是当今教育领域的一个重要工具&#xff0c;帮助学生和教师提高学习效果和教学质量。一个功能完善的在线培训系统可以提供丰富多样的学习资源和交互方式&#xff0c;以满足不同学生的需求。 个性化学习路径 每个学生的学习需求和进度都不同。通过个性化学习路径功…

汽车检测报告小程序开发制作方案

传统的车辆检测流程通常繁琐且耗时&#xff0c;用户对更快速、便捷的检测方式有了更高的期望。基于这一需求&#xff0c;开发一款汽车检测报告小程序将成为现实生活中的实用工具。 产品定位为一款提供汽车检测报告查询的小程序&#xff0c;主要服务于需要进行汽车检测的车主、…

python代码——批量删除目录下的指定文件

语言&#xff1a;python 3 用法&#xff1a;对该目录下的所有文件遍历&#xff0c;包括子目录&#xff0c;删除所有指定名称文件 如运行中报错&#xff0c;需要自行根据报错内容按照缺失的库 import osfrom tkinter import Tk from tkinter import filedialogroot Tk() roo…

C++桌面贪吃蛇,能通关的都是大神(Windows可编译)

文章目录 实现原理代码实现&#xff08;详见注释&#xff09; 实现原理 首先拿到所有桌面APP的路径。然后将它们都存进结构体&#xff0c;并存入指针数组&#xff08;前面的指向后面的&#xff09;。后面直接每次随机生成食物并且每次判断是否KO就行了。感兴趣也可以看看C贪…

学习maven工具

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f3e8;maven工具产生的背景&#x1f993;maven简介&#x1fa80;pom.xml文件(project object Model 项目对象模型) &#x1fa82;maven工具安装步骤两个前提&#xff1a;下载 m…

前端开发中移动端开发需要注意什么? - 易智编译EaseEditing

在前端开发中&#xff0c;移动端开发具有一些独特的挑战和注意事项。以下是移动端开发时需要注意的一些重要点&#xff1a; 响应式设计&#xff1a; 移动设备的屏幕尺寸和分辨率多样&#xff0c;因此要采用响应式设计&#xff0c;确保你的网站或应用在各种设备上都能良好地呈…

fastjson 序列化问题:Comparison method violates its general contract

fastjson 序列化问题&#xff1a;Comparison method violates its general contract 问题重现 今天在测试接口的时候&#xff0c;调用了Mybatis Plus 分页查询的接口&#xff0c;然后将查询的结果转换成 Json字符串的形式&#xff0c;结果报了这个错误&#xff1a; java.lang.…

端口监听常见方案

端口监听常见方案 一、原生Java import java.io.*; import java.net.ServerSocket; import java.net.Socket;public class SimpleServer {public static void main(String[] args) {int portNumber 8080; // 监听的端口号try (ServerSocket serverSocket new ServerSocket(…