我是反应式编程的新手,也是使用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发生变化时,如何启用按钮? 谢谢。
答案 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>
产生新值并在更改user
或password
时刷新命令状态,则应实现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)中使用该属性。