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

Disable and Enable Button on Textfield change with ReactiveUI

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

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

我有简单的登录 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);

其中用户和密码是私有字符串字段。 我还有 passwordTextField 和 userNameTextField UILabels on UI.

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

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

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>userpassword 发生更改时生成新值并刷新命令状态,您应该实施 userpassword 作为属性并在它们被设置为新值时引发 PropertyChanged 事件,例如:

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

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