で上記のコードを交換し、私は、3つの異なるソリューションがReactiveUI 6.5に前に私ができるように私のコマンドのCanExecute
とExecute
メソッドを呼び出すことが見つかりました:
オプション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();
}
:私はExecuteIfPossible
とGetCanExecute
方法を提供することで、小さな拡張メソッドを書いて、それをより快適にするために
command.ExecuteIfPossible().Subscribe();
注:Execute()
、その他の電話に必要なように、最後にSubscribe()
コールが必要です賢明なことは起こらない。
それとも、非同期を使用したいと待っている場合:
await command.ExecuteIfPossible();
コマンドを実行できるかどうかを確認したい場合は、単に(CanExecuteのための回避策を考え出すための
command.GetCanExecute()
感謝を呼び出すにはnull)を6.5からアップグレードする場合。 –
私は 'InvokeCommand'ウェイが好きです。 – Felix