我發現三種不同的解決方案來叫我的命令的CanExecute
和Execute
方法,如我之前可以在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中提到的那樣。
爲了使它更舒服,我寫了一個小的擴展方法提供ExecuteIfPossible
和GetCanExecute
方法:
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()
感謝找出變通的CanExecute( null)從6.5升級時。 –
我更喜歡'InvokeCommand'方式。 – Felix