MonoTouch MVVMCross绑定到实例变量

时间:2012-06-07 10:13:23

标签: binding xamarin.ios mvvmcross

这可能听起来很愚蠢,但我无法获得绑定到实例变量(类型为string)的工作。

在我的视图的xib中,我在IB中创建了一个文本字段作为插座,然后我可以将它绑定到我的viewModel的字符串属性。但是,它不会让我以同样的方式将我的视图的字符串变量绑定到viewModel的属性。

有人知道这是设计的,还是我错过了什么?绑定代码是 -

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

1 个答案:

答案 0 :(得分:2)

通过阅读你的问题,我认为你所说的是View本身有一个字符串类型的字段......

您的代码:

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

正尝试将Text引用的对象上的属性StringTemp绑定到ViewModel上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
    }
};

...但我个人倾向于避免使用这种类型的代码......