CommunityToolkit.Mvvm笔记---AsyncRelayCommand

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

平台 API:AsyncRelayCommandAsyncRelayCommand<T>RelayCommandIAsyncRelayCommandIAsyncRelayCommand<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;
    }
}

运行结果 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值