2016-11-29 24 views
5

Geride benim kodundan bir komut çalıştırmak için ReactiveUu 7'de ReactiveCommand.Execute() yöntemine doğrudan nasıl çağrı yapabilirim? Eski versiyonda sürümüne 7'ye ReactiveUI 6.5 den projemi dönüştürmek çalışıyorum

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

aradı.

Artık CanExecute yöntemi artık kullanılamaz ve IObservable<bool> bir özelliği ile değiştirilir. Sadece Execute().Subscribe() numaralı telefona çağrı yaparsam veya onu açık bir şekilde çağırmam gerekirse, CanExecute Gözlemlenebilir olarak adlandırılır mı? Şimdilik

benim komutunun CanExecute ve Execute yöntemleri çağırmak için üç farklı çözümler bulundu

command.Execute().Subscribe(); 

cevap

9

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() 
+0

Teşekkür çağrı null) 6.5'ten yükseltme yapılırken. –

+0

"InvokeCommand" yöntemini tercih ederim. – Felix