AsyncRelayCommand
是 CommunityToolkit.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;}
}
运行结果
这里就不做具体介绍了,自己拿着代码修改运行下,更好理解