绑定子属性MvvmCross

时间:2014-01-08 02:54:39

标签: c# wpf xamarin mvvmcross

mvvmcross本身是否支持绑定到嵌套属性?

例如,我有一个视图模型如下:

class MainViewModel : MvxViewModel
{
    public SubViewModelBase SubViewModel 
    { 
           get { return _subViewModel; }
           set { _subViewModel = value; RaisePropertyChanged(() => SubViewModel); }
    }
}

子视图模型可能会更改,但MainView将绑定到所有SubViewModelBase类的相同属性...示例SubViewModelBase类如下:

class SubViewModelBase : MvxViewModel
{
    public bool ShowIndeterminantProgress
    {
          get { return _showIndeterminantProgress; }
          set { _showIndeterminantProgress = value;  RaisePropertyChanged(() => ShowIndeterminantProgress);}
    }

    // ... More common properties ...
}

所以MainView理想地会像这样绑定

          this.CreateBinding(_progressBar)
         .For(view=> view.Visibility)
         .To<MainViewModel>(vm => vm.SubViewModel.ShowIndeterminantProgress)
         .WithConversion("Visibility")
         .Apply();

这应该有用吗?它似乎不起作用,但输出中没有绑定错误?

1 个答案:

答案 0 :(得分:3)

  

mvvmcross本身是否支持绑定到嵌套属性?

  

这应该有用吗?

例如,ApiExamples for Xamarin.iOS中的这一行正在运行:

        set.Bind(errorLabel2).To(vm => vm.Errors.Count);

https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/ApiExamples/ApiExamples.Touch/Views/FirstView.cs#L361

https://github.com/MvvmCross/MvvmCross/wiki/Databinding#fluent中描述了支持的功能集 - 但不可否认,这种流畅的绑定在Xamarin.iOS中比在Wpf中更为建立/使用。


要尝试调试当前绑定可能无法正常工作的原因,请尝试向视图添加一个提供调试输出的简单属性

private Visibility _mockVisibility;
public Visibility MockVisibility
{
   get
   {
      return _mockVisibility;
   }
   set
   {
       Debug.WriteLine("MockVisibility called with " + value);
       _mockVisibility = value;
   }
}

并将其绑定为:

  this.CreateBinding(this)
     .For(view=> view.MockVisibility)
     .To<MainViewModel>(vm => vm.SubViewModel.ShowIndeterminantProgress)
     .WithConversion("Visibility")
     .Apply();

这应该给你调试/跟踪输出,并且应该给你一个断点来理解调用堆栈的地方(尽管期望这包含很多反射,这很难通读)。

超越这个: