2016-11-30 51 views
1

我在WPF(.NET 4.0)中使用@ Stephen-Cleary AsyncCommand implementation,现在我想了解如何在命令定义期间指定CanExecute处理程序。AsyncCommand CanExecute处理程序

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

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

我看不出有任何创建过载,所以我可以指定CanExecute逻辑。

谢谢

伊戈尔

+0

发布链接提到的实现。 – 3615

+0

这是一个非常流行的异步命令实现(关于问题的链接),其中有很多对Web的引用,但我找不到任何示例或如何指定CanExecute行为。 –

+0

我认为这篇文章的出处具有教育意义,它是在那里展示的方法,而不是在现实生活中使用的“现实生活中的应用程序”。相反,我会建议看看[他在github上的库](https://github.com/StephenCleary/Mvvm.Async)。如果您确实想要保持该实现,则可以尝试继承AsyncCommand并重写CanExecute。 – 3615

回答

2

使用斯蒂芬·克利里的Nito.Mvvm.Async项目达到你所需要的。

添加的NuGet参照package<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(); 
} 

最后:enjoy

+0

不幸的是我的目标是.NET 4.0 –

+0

你指出的源代码是使用'await',就像'AsyncCommandBase'一样,有'await ExecuteAsync(parameter)'等用法。 'await'关键字在.NET 4.0中不可用,那么您如何设法编译该代码呢? – 3615

+0

好问题。几个月前,我不得不从.NET 4.5降级到4.0,所以我被Microsoft.Bcl.Async NuGet包保存。 –