2016-01-04 120 views
2

我在WPF應用程序中使用反應式UI。 有基類驗證:ReactiveUI ReactiveCommand canExecute using Subject <bool> not working

public abstract class ReactiveValidatingScreen : ReactiveScreen 
{ 
    public Subject<bool> ValidationObservable { get; } = new Subject<bool>(); 

    private void Validate(string propertyName) 
    { 
     // ... some logic 
     var isValid = GetValidationResult(); 
     ValidationObservable.OnNext(isValid); 
    } 
} 

,並查看模型:

public sealed class UserLoginViewModel : ReactiveValidatingScreen 
{ 
    public UserLoginViewModel() 
    { 
     Login = ReactiveCommand.CreateAsyncTask(ValidationObservable, x => LoginImpl()); 
    } 
} 

我的登錄按鈕始終關閉,而有一個叫:

ValidationObservable.OnNext(true); 

在驗證通過。

但如果我更改爲:

public sealed class UserLoginViewModel : ReactiveValidatingScreen 
{ 
    public UserLoginViewModel() 
    { 
     var canLogin = this.WhenAnyValue(x => x.UserName, x => !string.IsNullOrEmpty(x) && x.Length == 3); 
     Login = ReactiveCommand.CreateAsyncTask(canLogin, x => LoginImpl()); 
    } 
} 

它做工精細,符合市場預期。

ReactiveUI版本 - 6.5.0

回答

4

ReactiveCommand會懶洋洋地訂閱給出canExecute觀察到的,你的情況可能的解釋是,你Validate呼叫太早做,OnNext綁定的命令之前執行。

請嘗試用ReplaySubject(或BehaviorSubject)代替。

+1

謝謝你的回答。你迫使我進行更多的調查。這是我的錯(問題是我的訂閱代碼中的'Changed'事件,默認的'Scheduler'被'Throttle'使用,我將它改爲'Scheduler.CurrentThread'並開始工作。 –