如何在Mvvmcross中将monotouch UI元素的“enabled”属性绑定到视图模型布尔值

7

使用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'

我可能没有正确写绑定,因为我确实希望直接绑定到“启用”属性,而不是子属性 - 但我不太清楚如何做到这一点。
我已经查看了mvvmcross的一些示例,还看了一些N + 1视频,但似乎找不到匹配“enabled”或其他子属性绑定的示例。
谢谢
1个回答

12

我没看出你的代码有什么问题- 但是我刚刚尝试了https://github.com/slodge/Enabling,那个似乎可以运行...

所以我又仔细研究了一下...发现问题不在Enabled里面,而是在:

      To(x => !x.LoggingIn)

那不是一个简单的属性表达式,它使用了 ! 运算符。

你可以使用一个值转换器来替代 !

  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);

现在使用您的解决方案工作了。之前想得太多是Linq,而不是属性绑定!谢谢。 - Patrick McCurley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接