【问题标题】:ReactiveUI ReactiveCommand canExecute using Subject<bool> not workingReactiveUI ReactiveCommand canExecute using Subject<bool> 不起作用
【发布时间】:2016-01-04 18:26:43
【问题描述】:

我在 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

【问题讨论】:

    标签: wpf reactiveui


    【解决方案1】:

    ReactiveCommand 将懒惰地订阅给定的 canExecute observable,在您的情况下,可能的解释是您的 Validate 调用过早完成,OnNext 在命令绑定之前执行。

    改用ReplaySubject(或BehaviorSubject)。

    【讨论】:

    • 感谢您的回答。你逼我做更多的调查。这是我的错(问题出在Changed 事件的订阅代码中,默认SchedulerThrottle 使用,我将其更改为Scheduler.CurrentThread 并开始工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多