使用 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>
在 user
或 password
发生更改时生成新值并刷新命令状态,您应该实施 user
和 password
作为属性并在它们被设置为新值时引发 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)中使用该属性。
我是响应式编程的新手,也是使用 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>
在 user
或 password
发生更改时生成新值并刷新命令状态,您应该实施 user
和 password
作为属性并在它们被设置为新值时引发 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)中使用该属性。