CommunityToolkit.Mvvm笔记---AsyncRelayCommand

ops/2024/9/23 14:27:12/

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/ops/5973.html

相关文章

什么是三高架构

三高架构是指在软件系统设计与开发中&#xff0c;注重解决高并发性、高可用性和高性能的架构设计模式。 高并发性&#xff1a;指系统能够处理大量并发请求的能力。在高并发场景下&#xff0c;系统需要具备有效的并发处理机制&#xff0c;以保证系统能够快速、准确地响应大量并…

docker-compose 安装MongoDB续:创建用户及赋权

文章目录 1. 问题描述2. 分析2.1 admin2.2 config2.3 local 3. 如何连接3.解决 1. 问题描述 在这一篇使用docker-compose创建MongoDB环境的笔记里&#xff0c;我们创建了数据库&#xff0c;但是似乎没有办法使用如Robo 3T这样的工具去连接数据库。连接的时候会返回这样的错误&…

git 小记

一、 github新建仓库 git clone 。。。。。。。。。。。 &#xff08;增删查补&#xff0c;修改&#xff09; git add . git commit -m "修改” git push (git push main) 二、branch 分支 branch并不难理解&#xff0c;你只要想像将代码拷贝到不同目录…

【24届数字IC秋招总结】正式批面试经验汇总6——禾赛

文章目录 一、禾赛-数字IC验证工程师1.1 一面面试问题1.2 二面面试问题一、禾赛-数字IC验证工程师 面试时间:9.19 9.25 1.1 一面面试问题 1、自我介绍 2、研究生课题 3、build_phase从上至下还是从下至上 4、哪些phase是task phase 5、perl脚本做了什么 6、整个验证环境是怎…

NASA数据集——TANSO-FTS 运行前 11 年收集的测量数据中得出二氧化碳(CO2)干空气摩尔分数(XCO2)的估计值

ACOS GOSAT/TANSO-FTS Level 2 bias-corrected XCO2 and other select fields from the full-physics retrieval aggregated as daily files V7.3 (ACOS_L2_Lite_FP) at GES DISC 简介 ACOS Lite 文件包含经过偏差校正的 XCO2 以及其他选定字段的每日汇总文件。ACOS 2 级标准…

【wpf】ObservableCollection 跨线程报错问题

背景 ObservableCollection 我们之前介绍过他和List的区别。ObservableCollection 的好处在于&#xff0c;当集合发生变化时&#xff0c;能发送通知通知界面发生相应的更改。但是ObservableCollection 有个弊端。无法在非UI线程中访问。 要么就是通知失效了&#xff0c;要么就…

适用于Windows电脑的最佳数据恢复软件是哪些?10佳数据恢复软件

丢失我们系统中可用的宝贵信息是很烦人的。我们可以尝试几种手动方法来重新获取丢失的数据。然而&#xff0c;当我们采用非自动方法来恢复数据时&#xff0c;这是一项令人厌烦和乏味的工作。在这种情况下&#xff0c;我们可以尝试使用一些正版硬盘恢复软件进行数据恢复。此页面…

Vue3+TS版本Uniapp:项目前置操作

环境&#xff1a;使用vscode进行开发 如果一开始是使用的HbuilderX&#xff0c;请看hbuilderX创建的uniapp项目转移到vscode 为什么选择vscode&#xff1f;有更好的TS支持 学习TS的好处&#xff1f;减少维护代码的压力、鸿蒙ArkTS是基于TS的、提高代码水平拿高薪等… Vue3版…