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 视频,但似乎找不到启用的示例匹配或其他子属性绑定。

谢谢

4

1 回答 1

12

我看不出您的代码有什么问题 - 但我只是尝试了https://github.com/slodge/Enabling,这似乎有效......

所以我又看了看......问题不在启用 - 而是在:

      To(x => !x.LoggingIn)

这不是一个简单的属性表达式——它有!操作符。

!您可以使用 ValueConverter而不是使用,例如:

  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);
于 2013-09-23T10:53:18.323 回答