我正在使用 @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的完整代码