我在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
答案 0 :(得分:4)
ReactiveCommand
会懒惰地订阅给定的canExecute
观察点,在您的情况下,可能的解释是您的Validate
电话过早完成,OnNext
在此之前执行ReplaySubject
命令是绑定的。
请尝试使用BehaviorSubject
(或redirect_to :back
)。