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'

子プロップではなく「Enabled」プロパティに直接バインドしたいので、バインディングを間違って書いているに違いありませんが、これを行う方法がよくわかりません。

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 に答える