我正在使用WPF中的@Stephen AsyncCommand实现 (.NET 4.0),现在我试图了解如何在命令定义期间指定CanExecute处理程序。
通常,我创建这样的命令:
SaveCommandAsync = AsyncCommand.Create(async token =>
{
//async code
});我没有看到任何创建重载,所以我可以指定CanExecute逻辑。
谢谢,
Igor
发布于 2016-12-02 14:28:19
使用Stephen的Nito.Mvvm.Async项目来实现您的需要。
将nuget引用添加到套餐:<package id="Nito.Mvvm.Async" version="1.0.0-eta-05" targetFramework="net45" />
创建Xaml绑定:
<Button Content="Toggle" Command="{Binding MyAsyncCommand}"></Button>
创建CustomAsyncCommand,指定CanExecute函数
MyAsyncCommand = new CustomAsyncCommand(AsyncAction, x=> !_isWorking);
在AsyncAction中做了一些异步工作
private async Task AsyncAction(object obj) {
_isWorking = true;
MyAsyncCommand.OnCanExecuteChanged();
await Task.Delay(2000);
_isWorking = false;
MyAsyncCommand.OnCanExecuteChanged();
}最后是:尽情享受。
发布于 2022-08-09 07:34:24
只是为了更新这个话题。
目前,AsyncCommand的实际参考实现是在CommunityToolkit.Mvvm.Input项目中进行的,可以用A固有的NuGet进行引用。在代码中,它可以写成这样:
// In properties declaration
public IAsyncRelayCommand MyCommand { get; }
// In ctor
MyCommand = new AsyncRelayCommand(MyAction, () => MyCanExecute());
// Action declaration
private async Task MyAction() // Also could be a (CancellationToken token)
{ }
// Can exectute declaration
private bool DownloadTextCanExecute()
{ return !MyCommand.IsRunning; }请注意,CanExecute不启用或禁用绑定到a固有命令的按钮。它只允许执行命令。如果您希望通过启用或禁用按钮来表示CanExecute,则可以在XAML中使用如下内容:
<Button
Content="Click me!"
Command="{Binding MyCommand}"
IsEnabled="{Binding MyCommand.IsRunning, Converter={StaticResource InverseBooleanConverter}, Mode=OneWay}"/>您可以在其他答案中找到InverseBooleanConverter的实现。或者您可以看到演示项目WpfAsyncCommandExample的完整代码。
https://stackoverflow.com/questions/40887595
复制相似问题