ile yukarıdaki kodu değiştirilir önce ReactiveUI 6.5'te olabilir gibi:
Seçenek 1
Bu, sürüm 6.5'teki çağrıya eşittir, ancak komutu bir ICommand'a açıkça dönüştürmemiz gerekir:
if (((ICommand) command).CanExecute(null))
command.Execute().Subscribe();
Seçenek 2
if(command.CanExecute.FirstAsync().Wait())
command.Execute().Subscribe()
veya uyumsuz varyantı 3
Diğer bir seçenek InvokeCommand
uzantısı yöntem bize yapmaktır
if(await command.CanExecute.FirstAsync())
await command.Execute()
isteğe bağlı olarak. documentation belirtilen gibi
Observable.Start(() => {}).InvokeCommand(ViewModel, vm => vm.MyCommand);
Bu, komutun executability saygı duyar. Amacıyla
yapmak için ben bir ExecuteIfPossible
ve GetCanExecute
yöntemi sağlamak için küçük bir uzantısı yöntemi yazdık daha rahat şöyledir:
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();
}
Bu uzatma yöntemi kullanabilirsiniz:
command.ExecuteIfPossible().Subscribe();
Not: Subscribe()
aramasının sonunda, Execute()
numaralı telefona çağrı için ihtiyacınız olduğu gibi bilge hiçbir şey olmayacak. Eğer uyumsuz kullanmak istiyorsanız ve bekliyor eğer
Veya:
await command.ExecuteIfPossible();
bir komut çalıştırılabilir olmadığını kontrol etmek istiyorsanız, sadece (CanExecute için çalışma arounds bulmaktan için
command.GetCanExecute()
Teşekkür çağrı null) 6.5'ten yükseltme yapılırken. –
"InvokeCommand" yöntemini tercih ederim. – Felix