如何将单触摸UI元素的'enabled'属性绑定到Mvvmcross中的viewmodel boolean

时间:2013-09-23 10:19:44

标签: xamarin mvvmcross

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

由于

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