【问题标题】:Disable and Enable Button on Textfield change with ReactiveUI使用 ReactiveUI 禁用和启用文本字段更改上的按钮
【发布时间】:2018-07-03 12:02:50
【问题描述】:

我是响应式编程的新手,也是使用 ReactiveUI 的新手 所以我需要一点帮助。

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

我有一个简单的 Login ViewController,我想在 TextField 状态发生变化时立即启用按钮。

我有那些字段。

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

我正在使用 this.WhenAnyValue 方法

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 上有 passwordTextField 和 userNameTextField UILabels。

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

那么当 textFields 发生变化时,我如何才能启用按钮呢? 谢谢。

【问题讨论】:

    标签: c# xamarin xamarin.ios reactive-programming reactiveui


    【解决方案1】:

    canLogin 应该是传递给CreateFromObservable 方法的第二个参数。第一个参数应该是Func&lt;IObservable&lt;bool&gt;&gt;。这应该编译:

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

    但是对于 IObservable&lt;bool&gt; 生成新值并在 userpassword 更改时刷新命令状态,您应该实现 userpassword 作为属性并引发 PropertyChanged 事件每当它们设置为新值时,例如:

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

    【讨论】:

    • 如果状态改变,我必须在哪里编写按钮禁用或启用的逻辑?
    • canLogin 是你要禁用或启用按钮的地方
    • 命令内部通常有启用/禁用逻辑。 ICommand 接口上有一个方法 CanExecute() ,它是 ReactiveCommand 派生的。 UI 将轮询此方法以确定它是否应该启用/禁用控件。 ReactiveCommand 的 CanExecute 版本将返回您作为 CreateFromObservable 的第二个参数传入的 Can Execute observable 的最新值。
    • @TornikeGomareli:只需为属性引发 PropertyChanged 事件。查看我的编辑。
    【解决方案2】:

    您需要为使用 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 中使用用户和密码,而不是用户/密码字段。此外,在您的代码和绑定中使用该属性(对于 TextFields)。

    【讨论】:

      猜你喜欢
      • 2018-07-17
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 2021-07-15
      • 2011-06-24
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      相关资源
      最近更新 更多