ReactiveUI ReactiveCommand可以使用Subject <bool>无法正常执行

时间:2016-01-04 18:26:44

标签: wpf reactiveui

我在WPF应用程序中使用反应式ui。 有验证的基类:

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

1 个答案:

答案 0 :(得分:4)

ReactiveCommand会懒惰地订阅给定的canExecute观察点,在您的情况下,可能的解释是您的Validate电话过早完成,OnNext在此之前执行ReplaySubject命令是绑定的。

请尝试使用BehaviorSubject(或redirect_to :back)。