2016-11-29 9 views
5

私は背後に私のコードからコマンドを実行するためにReactiveUI 7のReactiveCommand.Execute()への直接呼び出しを行うにはどうすればよいですか?

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

と呼ばれる古いバージョンではバージョン7にReactiveUI 6.5からの私のプロジェクトを変換しようとしています。

これで、CanExecuteメソッドは使用できなくなり、IObservable<bool>のプロパティに置き換えられました。 Execute().Subscribe()を呼び出すか、明示的に呼び出す必要がある場合は、CanExecute Observableが自動的に呼び出されますか?今の

は私が

command.Execute().Subscribe(); 

答えて

9

で上記のコードを交換し、私は、3つの異なるソリューションがReactiveUI 6.5に前に私ができるように私のコマンドのCanExecuteExecuteメソッドを呼び出すことが見つかりました:

オプション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で述べたようにこれは、コマンドの実行可能性を尊重します。

を次のようにあなたは、この拡張メソッドを使用することができます

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(); 
} 

:私はExecuteIfPossibleGetCanExecute方法を提供することで、小さな拡張メソッドを書いて、それをより快適にするために


command.ExecuteIfPossible().Subscribe(); 

注:Execute()、その他の電話に必要なように、最後にSubscribe()コールが必要です賢明なことは起こらない。

それとも、非同期を使用したいと待っている場合:

await command.ExecuteIfPossible(); 

コマンドを実行できるかどうかを確認したい場合は、単に(CanExecuteのための回避策を考え出すための

command.GetCanExecute() 
+0

感謝を呼び出すにはnull)を6.5からアップグレードする場合。 –

+0

私は 'InvokeCommand'ウェイが好きです。 – Felix

関連する問題