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

Pat*_*ley 7 mvvmcross xamarin

使用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();
Run Code Online (Sandbox Code Playgroud)

'UserName'的绑定成功绑定到UsernameTextField.但是,当LoginCommand被触发时(为简洁起见排除),我不想在登录例程正在进行时将UI控件设置为'Enabled = false'.

上面的代码在x.Enabled绑定的运行时失败

System.ArgumentException: Property expression must be of the form 'x => x.SomeProperty.SomeOtherProperty'
Run Code Online (Sandbox Code Playgroud)

我必须正确地编写绑定,因为我希望直接绑定到'Enabled'属性,而不是子prop - 但我不能完全看到如何执行此操作.

我查看了mvvmcross上的一些示例,并查看了几个N + 1视频,但我似乎无法找到启用的示例匹配或其他子属性绑定.

谢谢

Stu*_*art 12

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

所以我再看一下......问题不在启用 - 而是在:

      To(x => !x.LoggingIn)
Run Code Online (Sandbox Code Playgroud)

这不是一个简单的属性表达式 - 它有!运营商.

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

  public class InverseValueConverter : MvxValueConverter<bool, bool>
  {
      protected override bool Convert(bool value, ...)
      {
          return !value;
      }
  }
Run Code Online (Sandbox Code Playgroud)

然后:

  bindingSet.Bind(this.UsernameTextField)
            .For(x=>x.Enabled)
            .To(x => x.LoggingIn)
            .WithConversion(new InverseValueConverter(), null);
Run Code Online (Sandbox Code Playgroud)