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

时间:2018-07-03 12:02:51

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

我是反应式编程的新手,也是使用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发生变化时,如何启用按钮? 谢谢。

2 个答案:

答案 0 :(得分:1)

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时刷新命令状态,则应实现user和{{1} }作为属性,并在设置为新值时引发password事件,例如:

PropertyChanged

答案 1 :(得分:0)

您需要创建用于使用WhileAnyValue扩展方法的属性:

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中使用用户名和密码代替用户名/密码字段。另外,在代码和绑定(用于TextField)中使用该属性。