CommunityToolkit.Mvvm笔记---AsyncRelayCommand

news/2024/12/23 1:20:54/

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.ppmy.cn/news/1424569.html

相关文章

华为OD-C卷-密码解密[100分]Python3+C语言-90%

题目描述 给定一段“密文”字符串 s,其中字符都是经过“密码本”映射的,现需要将“密文”解密并输出。 映射的规则(a ~ i)分别用(1 ~ 9)表示;(j ~ z)分别用("10*" ~ "26*")表示。 约束:映射始终唯一。 输入描述 “密文”字符串 输出描述 …

Hive进阶(4)----MapReduce的计算过程(赋图助君理解)

MapReduce的计算过程 MapReduce是一种编程模型和处理大规模数据集的方法。它通常用于分布式计算环境中&#xff0c;能够将数据处理任务分解成独立的部分&#xff0c;分配给多台计算机进行并行处理。这个模型由Google提出&#xff0c;并在开源领域中得到了广泛的应用和实现。Map…

uniapp 当前系统没有安装苹果根证书,是否打开证书目录(打开后依次安装证书

当你遇到这类问题时&#xff0c;说明你也极其的困惑&#xff01;这就是为啥大抵国内这些货色搞的东西总是不尽人意&#xff01;连开发者生态都搞不好&#xff0c;就急着吹嘘。 这是官方给的技术说明方案&#xff1a; 恭喜你&#xff0c;当你按照这个搞之后&#xff0c;你的问题…

Kolla-ansible部署OpenStack集群

0. OpenStack 部署 系统要求 单机部署最低配置&#xff1a; 2张网卡8G内存40G硬盘空间 主机系统&#xff1a; CentOS Stream 9Debian Bullseye (11)openEuler 22.03 LTSRocky Linux 9- Ubuntu Jammy (22.04) 官方不再支持CentOS 7作为主机系统&#xff0c;我这里使用的是R…

Linux_CentOS7/8系统 - 关闭图形界面新增用户机制手册

Linux_CentOS7/8系统 - 关闭图形界面新增用户机制手册 在系统完成图形界面安装后重新启动后第一次登入&#xff0c;在图形界面会有新增用户页面&#xff0c;那如果取消关闭可以按以下操作&#xff1a; CTRLALTF2 root账号登录 yum remove gnome-initial-setup -y init 3 init …

正则表达式中?=、?!、?<=、?<!、?:的理解与应用举例

正则表达式就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个规则字符串,这个规则字符串表达对字符串的一种过滤逻辑,这篇文章主要给大家介绍了关于正则表达式中?、?!、?&#xff1c;、?&#xff1c;!、?:的理解与应用举例的相关资料,需要的朋友可以参考下 …

深度 | 践行绿色健康可持续发展,这家企业提供了价值范本

文 | 螳螂观察 作者 | 余一 近段时间以来&#xff0c;小米SU7热度一直不减&#xff0c;在展露小米强大品牌号召力的同时&#xff0c;也侧面体现出了当前消费者对于新能源汽车的喜爱。 而消费者选择新能源汽车时&#xff0c;环保因素也起到了至关重要的作用。像前几日&#x…

【2024官方文档版】React-描述IU

系列文章目录 一、快速入门【基础】 二、描述IU 文章目录 系列文章目录二、描述IU1.第一个组件1.1 组件是什么?1.2 构建组件的方法1.3嵌套和组织组件1.4课后作业1.5 小结: 2.组件的导入导出2.1根组件文件2.2 导入导出文件 3. 使用JSX书写标签语言3.1 将HTML转化为JSX3.2作业 …