CommunityToolkit.Mvvm笔记---AsyncRelayCommand

news2025/1/19 16:47:19

AsyncRelayCommandCommunityToolkit.Mvvm 中的一个功能,专门设计用来处理异步操作。它是 RelayCommand 的一个变体,提供了对异步任务的支持,允许开发者在 MVVM(Model-View-ViewModel)模式中方便地实现异步命令。使用 AsyncRelayCommand 可以确保 UI 保持响应性,同时执行长时间运行的操作,如网络请求或大规模数据处理。

平台 API:AsyncRelayCommand、AsyncRelayCommand<T>、RelayCommand、IAsyncRelayCommand、IAsyncRelayCommand<T>

工作原理

AsyncRelayCommand 和 AsyncRelayCommand<T> 具有以下主要功能:

  • 它们扩展了库中包含的同步命令的功能,并支持 Task 返回委托。
  • 它们可以使用附加 CancellationToken 参数包装异步函数以支持取消,并公开 CanBeCanceled 和 IsCancellationRequested 属性以及 Cancel 方法。
  • 它们公开可用于监视挂起操作进度的 ExecutionTask 属性,以及可用于检查操作完成时间的 IsRunning 属性。 这对于将命令绑定到 UI 元素(如加载指示器)特别有用。
  • 它们实现 IAsyncRelayCommand 和 IAsyncRelayCommand<T> 接口,这意味着 viewmodel 可以轻松地使用这些接口来公开命令,从而减少类型之间的紧密耦合。 例如,这样就可以轻松地将命令替换为公开相同公共 API 图面的自定义实现(如果需要)。
应用示例(AsyncRelayCommand )

步骤1:xaml视图

<TextBlock Width="200" Height="30" Text="{Binding Data}" FontSize="16" />
<Button Width="150" Height="30" Content="Load Data"
    Command="{Binding LoadDataCommand}"
    Margin="5"/>

步骤2:创建ViewModel

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Threading.Tasks;

public class MainViewModel : ObservableObject
{
    private string _data;
    public string Data
    {
        get => _data;
        set => SetProperty(ref _data, value);
    }

    public IAsyncRelayCommand LoadDataCommand { get; }

    public MainViewModel()
    {
        LoadDataCommand = new AsyncRelayCommand(LoadDataAsync);
    }

    private async Task LoadDataAsync()
    {
        Data = "Loading data...";
        await Task.Delay(2000);  // 模拟一个耗时的数据加载过程
        Data = "Data loaded successfully!";
    }
}

运行结果如下:

应用示例(带参数 AsyncRelayCommand<T>) 

步骤1:xaml视图实现

<TextBox  Width="150" Height="30"  Margin="5" Text="{Binding InputValue}"/>
<TextBlock Width="200" Height="30" Text="{Binding Data}" FontSize="16" />
<Button Width="150" Height="30" Content="Load Data"
    Command="{Binding LoadDataCommand}"
        CommandParameter="{Binding InputValue}"
    Margin="5"/>

步骤2:ViewModel实现

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Threading.Tasks;

public class MainViewModel : ObservableObject
{
    private string _data;
    public string Data
    {
        get => _data;
        set => SetProperty(ref _data, value);
    }
    [ObservableProperty]
    private string _inputValue;

    public IAsyncRelayCommand<string> LoadDataCommand { get; }

    public MainViewModel()
    {
        LoadDataCommand = new AsyncRelayCommand<string>(LoadDataAsyncParam);
    }

    private async Task LoadDataAsyncParam(string input)
    {
        Data = "Loading data...";
        await Task.Delay(2000);  // 模拟一个耗时的数据加载过程
        Data = input;
    }
}

运行结果 

这里就不做具体介绍了,自己拿着代码修改运行下,更好理解 

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

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

相关文章

前端打包webpack vite

起步 | webpack 中文文档 | webpack中文文档 | webpack中文网 npm run build 1webpack: mkdir webpack-demo cd webpack-demo npm init -y npm install webpack webpack-cli --save-dev vite : 快速上手 | Vue.js

Android Room 记录一个Update语句不生效的问题解决记录

代码展示 1.数据实体类 Entity public class User {PrimaryKey(autoGenerate true)private long id;private String name;private String age;private String sex;public User(String name, String age, String sex) {this.name name;this.age age;this.sex sex;}public …

CSS基础:table的4个标签的样式详解(6000字长文!附案例)

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

llama_factory微调QWen1.5

GitHub - hiyouga/LLaMA-Factory: Unify Efficient Fine-Tuning of 100 LLMsUnify Efficient Fine-Tuning of 100 LLMs. Contribute to hiyouga/LLaMA-Factory development by creating an account on GitHub.https://github.com/hiyouga/LLaMA-FactoryQwen1.5 介绍 | QwenGITH…

EEG基础

01 简介 脑电图(EEG)因其低成本、无创、便携以及毫秒级的高时间分辨率等特点&#xff0c;成为了研究大脑功能、异常和神经生理动力学的可靠且广泛使用的测量工具。 在神经信号处理领域&#xff0c;EEG通常作为一种非侵入性的脑成像技术用于诊断脑部疾病&#xff0c;而正常EE…

50.基于SpringBoot + Vue实现的前后端分离-酒店管理系统(项目 + 论文PPT)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的酒店管理系统设计与实现管理工作系统…

VMware最新下载安装

1、打开浏览器 搜索VMware官网&#xff0c;点进去。如图&#xff1a; 这里有两种下载方法&#xff0c;便洁就是我这种&#xff0c;还有一种就是注册账号之后下载就完全没有必要了&#xff0c;而且基本注册不了&#xff0c;不太好注册。 2、选择"产品"第二个选项 …

深度剖析扫雷游戏的各个知识点(2)

小伙伴们&#xff0c;大家好。这次继续上次的剖析扫雷游戏的知识点。 那么本次咱们主要是讲扫雷中的宏定义&#xff0c;也就是#define这些 首先#define是用来定义一个宏&#xff0c;后面就是类似于和变量一样的常量名&#xff0c;以及最后的数字就是它的值。 定义规则 #def…

被Claude3的图生代码技术秀到了,前端开发效率,提升到秒级

被Claude3的图生代码技术秀到了&#xff01;前端开发效率&#xff0c;提升到秒级 上传一张网站图片&#xff0c;用Claude3 生成实现这个网站的代码的教程来啦&#xff01; 在Claude3 的中文网站上一分钟就能实现&#xff0c;生成前端代码。中文网站地址是https://askmanyai.c…

【银角大王———Django学习DAY0——基础准备】

银角大王——Django学习前情提要 &#xff08;1&#xff09;在pycharm中下载Flask&#xff08;2&#xff09;使用Flask&#xff08;3&#xff09;下载BootStrap框架&#xff08;4&#xff09; 使用BootStrap框架 &#xff08;1&#xff09;在pycharm中下载Flask 在设置——项目…

【cmu15445c++入门】(14)C++的 =delete和=default

一、定义 &#xff08;1&#xff09;default 在C中&#xff0c; default 是一种特殊的语法&#xff0c;用于显式地请求编译器生成一个函数的默认实现。当应用于构造函数时&#xff0c; default 告诉编译器生成一个默认构造函数。默认构造函数是一个不接受任何参数的构造函数。…

Linux给磁盘扩容(LVM方式)

Linux给磁盘扩容&#xff08;LVM方式&#xff09; 最近测试性能&#xff0c;在本地打数据时&#xff0c;发现磁盘空间不足&#xff0c;于是想手动给/挂载点添加空间。这里介绍通过LVM方式快速给磁盘扩容。 LVM:是一种技术&#xff0c;方便管理磁盘。如果不用LVM&#xff0c;那…

经典网络解读—IResNet

论文&#xff1a;Improved Residual Networks for Image and Video Recognition&#xff08;2020.4&#xff09; 作者&#xff1a;Ionut Cosmin Duta, Li Liu, Fan Zhu, Ling Shao 链接&#xff1a;https://arxiv.org/abs/2004.04989 代码&#xff1a;https://github.com/iduta…

IK分词器安装、配置、分词自定义、Rest使用、SpringBoot使用

文章目录 1. 概述2. 安装配置3. 自定义拆分文本4. 调用4.1 拆分规则4.2 Rest 调用4.3 SpringBoot 调用 1. 概述 IK分词器是ElasticSearch(es)的一个最最最有名插件&#xff0c;能够把一段中文或者别的语句划分成一个个的关键字&#xff0c;进而在搜索的时候对数据库中或者索引库…

并发场景下 缓存击穿 穿透 雪崩如何解决

最近建了一个技术交流群&#xff0c;欢迎志同道合的同学加入&#xff0c;群里主要讨论&#xff1a;分享业务解决方案、深度分析面试题并解答工作中遇到的问题&#xff0c;同时也能为我提供写作的素材。 群号 208236931&#xff0c;欢迎进群交流学习&#xff0c;一起进步、进步、…

3.4 海思SS928开发 - 烧写工具 - BurnTool Emmc 烧写

3.4 烧写工具 - BurnTool Emmc 烧写 BurnTool 工具提供了多种烧写方式&#xff0c;这里只介绍最常用的 烧写emmc方式。 环境准备 PC 与单板之间连接好调试串口以及网线。 将厂商提供的出厂镜像拷贝至 PC 硬盘上&#xff0c;解压后得到的文件如下&#xff1a; . ├── boot_…

ARM学习(26)链接库的依赖查看

笔者今天来聊一下查看链接库的依赖。 通常情况下&#xff0c;运行一个可执行文件的时候&#xff0c;可能会出现找不到依赖库的情况&#xff0c;比如图下这种情况&#xff0c;可以看到是缺少了license.dll或者libtest.so&#xff0c;所以无法运行。怎么知道它到底缺少什么dll呢&…

收藏这份方案,制造业营销管理快人一步【内附下载链接】

随着“中国制造2025”等政策的实施&#xff0c;制造业正经历着技术革新和产业升级&#xff0c;尤其在智能化和绿色制造领域取得了显著进展。 然而&#xff0c; 制造业面临着消费者需求日益多样化和个性化的挑战&#xff0c;迫切需要从生产导向转变为市场导向。与此同时&#…

Transformer中的位置编码详解

什么是位置编码 位置编码概述 位置编码的目的是为了补充序列的位置信息&#xff0c;这是因为自注意力机制本身不包含位置的概念&#xff08;例如顺序信息&#xff09;。位置编码的具体作用是&#xff0c;对于不同的输入序列成分&#xff0c;赋予其不同的位置标识&#xff0c;确…

RIP小实验配置及缺省路由下发

配置如下&#xff1a; IP配置&#xff1a; IP配置完先查看RIP协议学习到的路由表&#xff0c;没有内容则代表没有开启RIP 启用RIP&#xff1a;这里的rip后跟的ID只具有本地意义&#xff0c;可以在1-65535之间随便取&#xff0c;不同路由器之间都可以取用不同的&#xff0c;为了…