Asynccommand Canexecute处理程序



我正在使用 @stephen-cleary asynccommand在wpf(.net 4.0)中的实现,现在我试图找出如何在命令定义期间指定Canexecute处理程序。

通常我会创建这样的命令:

            SaveCommandAsync = AsyncCommand.Create(async token =>
            {
                //async code    
            });

我看不到任何创建过载,因此我可以指定Canexecute逻辑。

谢谢,

igor

使用Stephen Cleary的nito.mvvm.sasync项目来实现您需要的东西。

将nuget引用到包: <package id="Nito.Mvvm.Async" version="1.0.0-eta-05" targetFramework="net45" />

创建XAML绑定:

<Button Content="Toggle" Command="{Binding MyAsyncCommand}"></Button>

创建custicasynccommand,指定canexecute函数

MyAsyncCommand = new CustomAsyncCommand(AsyncAction, x=> !_isWorking);

在异步中做一些异步工作

private async Task AsyncAction(object obj) {
    _isWorking = true;
    MyAsyncCommand.OnCanExecuteChanged();
    await Task.Delay(2000);
    _isWorking = false;
    MyAsyncCommand.OnCanExecuteChanged();
}

最后:享受。

仅用于更新此主题。

目前,Asynccommand的实际参考实现位于communityToolkit.mvvm.ut项目中,可以用适当的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不能启用或禁用具有与Aprips命令结合的按钮。它只能执行命令。如果您想通过启用或禁用按钮来表示canecute,则可以在XAML中使用类似以下内容:

<Button
        Content="Click me!"
        Command="{Binding MyCommand}"
        IsEnabled="{Binding MyCommand.IsRunning, Converter={StaticResource InverseBooleanConverter}, Mode=OneWay}"/>

您可以在其他答案中找到一个逆向逆变器的实现。或者,您可以看到演示项目WPFASYNCCOMMANDEXAMPL的完整代码

相关内容