2016-11-29 43 views
5

我想我的項目從ReactiveUI 6.5轉換爲7版本在舊版本我以從我的代碼執行後面的命令調用如何在ReactiveUI 7中直接調用ReactiveCommand.Execute()?

// var command = ReactiveCommand.Create...; 
// ... 
if(command.CanExecute(null)) 
    command.Execute(null); 

現在CanExecute方法是不再可用,並且用IObservable<bool>屬性所取代。如果我只需致電Execute().Subscribe()或必須明確調用它,CanExecute Observable是否會自動調用?

現在我更換了上面的代碼與

command.Execute().Subscribe(); 

回答

9

我發現三種不同的解決方案來叫我的命令的CanExecuteExecute方法,如我之前可以在ReactiveUI 6.5:

選項1

這等於在6.5版本的電話,但我們需要在命令顯式轉換爲一個ICommand:

if (((ICommand) command).CanExecute(null)) 
    command.Execute().Subscribe(); 

選項2

if(command.CanExecute.FirstAsync().Wait()) 
    command.Execute().Subscribe() 

或異步變體:

if(await command.CanExecute.FirstAsync()) 
    await command.Execute() 

選項3

另一種選擇是使我們InvokeCommand擴展方法的。

Observable.Start(() => {}).InvokeCommand(ViewModel, vm => vm.MyCommand); 

這就尊重命令的可執行性,就像documentation中提到的那樣。


爲了使它更舒服,我寫了一個小的擴展方法提供ExecuteIfPossibleGetCanExecute方法:

public static class ReactiveUiExtensions 
{ 
    public static IObservable<bool> ExecuteIfPossible<TParam, TResult>(this ReactiveCommand<TParam, TResult> cmd) => 
     cmd.CanExecute.FirstAsync().Where(can => can).Do(async _ => await cmd.Execute()); 

    public static bool GetCanExecute<TParam, TResult>(this ReactiveCommand<TParam, TResult> cmd) => 
     cmd.CanExecute.FirstAsync().Wait(); 
} 

如下您可以使用此擴展方法:

command.ExecuteIfPossible().Subscribe(); 

注意:您最終需要撥打Subscribe(),就像您需要撥打Execute(),其他沒有什麼會發生。

或者,如果你想使用異步和等待:

await command.ExecuteIfPossible(); 

如果你想檢查是否可以執行的命令,只需調用

command.GetCanExecute() 
+0

感謝找出變通的CanExecute( null)從6.5升級時。 –

+0

我更喜歡'InvokeCommand'方式。 – Felix

相關問題