2016-11-30 31 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包保存。 –