代码之家  ›  专栏  ›  技术社区  ›  Tornike Gomareli

禁用和启用文本字段更改上的按钮,并使用ReactiveUI

  •  2
  • Tornike Gomareli  · 技术社区  · 7 年前

    我是反应式编程的新手,也是使用reactiveUI的新手 所以我需要一些帮助。

    我正在做一个项目,我们正在使用XamariniOS for iOS平台。

    我有一个简单的登录视图控制器,当textfield状态改变时,我想立即启用按钮。

    我有那些田地。

            private string user;
            private string password;
            private ReactiveCommand<Unit,bool> loginCommand;
            private ReactiveCommand<Unit,Unit> canselCommand;
    

    我用的是 这是什么价值观 方法

    var canLogin = this.WhenAnyValue(x => x.user, x => x.password, (userName, password) =>
                                                  !string.IsNullOrWhiteSpace(userName) && !string.IsNullOrWhiteSpace(password));
    
                this.loginCommand = ReactiveCommand.CreateFromObservable(
                () =>
                   Observable
                    .Return(this.passwordTextField.Text == "Tornike"))
                    .Delay(TimeSpan.FromSeconds(1.5))
                    .TakeUntil(this.canselCommand);
    

    其中用户和密码是私有字符串字段。 而且我在用户界面上有密码文本字段和用户名文本字段ui标签。

    到处都有红线错误,我有点害怕。

    那么,我如何才能在文本字段更改时启用该按钮呢? 谢谢。

    2 回复  |  直到 7 年前
        1
  •  1
  •   mm8    7 年前

    canLogin 应该是传递给 CreateFromObservable 方法。第一个参数应该是 Func<IObservable<bool>> . 这应该编译:

    this.loginCommand = ReactiveCommand.CreateFromObservable(
    () =>
        Observable
        .Return(this.passwordTextField.Text == "Tornike")
        .Delay(TimeSpan.FromSeconds(1.5))
        .TakeUntil(this.canselCommand), canLogin);
    

    但对于 IObservable<bool> 每当 user password 如果更改,则应实现 用户 密码 作为属性并提高 PropertyChanged 当它们设置为新值时发生事件,例如:

    public string User
    {
        get { return user;}
        set { this.RaiseAndSetIfChanged(ref user, value);
    }
    
        2
  •  0
  •   Luis    7 年前

    您需要为使用WhenanyValue扩展方法创建属性:

    public string User
    {
        get { return user;}
        set { this.RaiseAndSetIfChanged(ref user, value);
    }
    
    public string Password
    {
        get { return password;}
        set { this.RaiseAndSetIfChanged(ref password, value);
    }
    

    在指挥部中:

    this.loginCommand = ReactiveCommand.CreateFromObservable(
            () =>
               Observable
                .Return(this.passwordTextField.Text == "Tornike"))
                .Delay(TimeSpan.FromSeconds(1.5))
                .TakeUntil(this.canselCommand),
    canExecute: canLogin);
    

    在WhenanyValue中使用用户和密码,而不是用户/密码字段。另外,在代码和绑定(对于文本字段)中使用该属性。