1

これはおそらく本当にばかげているように聞こえますが、(文字列型の)インスタンス変数へのバインディングを機能させることができません。

ビューのxibで、IBのアウトレットとしてテキストフィールドを作成し、それをviewModelの文字列プロパティにバインドできます。ただし、同じ方法でビューの文字列変数をviewModelのプロパティにバインドすることはできません。

これが設計によるものなのか、それとも私が何かを見逃しているのかを誰かが知っていますか?バインディングコードは-

this.AddBindings(
     new Dictionary<object, string>()
     {
          { TextFieldTemp, "{'Text':{'Path':'AboutText'}}" },
     });
4

1 に答える 1

2

あなたの質問を読んで、あなたが言っていることは、ビュー自体が文字列型のフィールドを持っているということだと思います...

あなたのコード:

this.AddBindings(
     new Dictionary<object, string>()
     {
          { StringTemp, "{'Text':{'Path':'AboutText'}}" },
     });

Textが参照するオブジェクトのプロパティを、ViewModelにあるStringTempものにバインドしようとしています。AboutText


文字列自体を設定するには、次のStringTempようなものを使用して文字列にバインドできる必要があります。

 this.AddBindings(
      new Dictionary<object, string>()
      {
           { this, "{'StringTemp':{'Path':'AboutText'}}" },
      });

の部分を説明するためだけに:{ this, "{'StringTemp':{'Path':'AboutText'}}" }、これらは次のように考えることができます{ TargetObject, "{'TargetPropertyName':{'Path':'SourcePropertyName'}}" }

  • TargetObject(this)は、プロパティ値を設定することを目的としているオブジェクトです
  • TargetPropertyName(StringTemp)は、設定しようとしている名前プロパティです
  • SourcePropertyName(AboutText)は、値のソースとなるプロパティの名前です。

Mvxはフィールドではなくプロパティを使用するためprivate string StringTemp {get;set;}、バインド可能ですが、そうではないことに注意してくださいprivate string StringTemp;


必要に応じて、この文字列参照に対して双方向バインディングを実行することもできます...ただし、そのためにはカスタムバインディング情報を設定する必要があります-ViewModelを更新するには、イベントが発生してキャプチャされる必要があります(私はそれを別の日に残しておきます!)


直接バインディングが探しているものではない状況では、いつでもPropertyChangedをサブスクライブして、より詳細なコードで通知を処理できます...例:

ViewModel.PropertyChanged += (s,e) => 
{
    if (e.PropertyName == "AboutText")
    {
         // do something complicated here with the new ViewModel.AboutText value
    }
};

...しかし、私は個人的にこのタイプのコードをできる限り避ける傾向があります...

于 2012-06-07T11:20:15.823 に答える