使用MVVMCross在IOS Droid中编写我的登录页面。
这是我到目前为止所拥有的
var bindingSet = this.CreateBindingSet<LoginPageView, LoginPageViewModel>();
bindingSet.Bind(this.UsernameTextField).To(x => x.UserName).TwoWay();
bindingSet.Bind(this.UsernameTextField).For(x=>x.Enabled).To(x => !x.LoggingIn);
bindingSet.Apply();
'UserName'的绑定成功绑定到UsernameTextField。但是,当LoginCommand被触发时(为简洁起见排除),我不想在登录例程正在进行时将UI控件设置为'Enabled = false'。
上面的代码在x.Enabled绑定的运行时失败,带
System.ArgumentException: Property expression must be of the form 'x => x.SomeProperty.SomeOtherProperty'
我必须错误地编写绑定,因为我希望直接绑定到'Enabled'属性,而不是子道具 - 但我不能完全看到如何执行此操作。
我查看了mvvmcross上的一些示例,并查看了几个N + 1视频,但我似乎无法找到启用的示例匹配或其他子属性绑定。
由于
答案 0 :(得分:11)
我看不出你的代码出了什么问题 - 但我只是尝试了https://github.com/slodge/Enabling,这似乎有用......
所以我又看了一眼......问题不在启用状态 - 而是在:
To(x => !x.LoggingIn)
这不是一个简单的属性表达式 - 它有!
运算符。
您可以使用ValueConverter,而不是使用!
,而不是:{/ p>
public class InverseValueConverter : MvxValueConverter<bool, bool>
{
protected override bool Convert(bool value, ...)
{
return !value;
}
}
然后:
bindingSet.Bind(this.UsernameTextField)
.For(x=>x.Enabled)
.To(x => x.LoggingIn)
.WithConversion(new InverseValueConverter(), null);