【问题标题】:Binding sub properties MvvmCross绑定子属性 MvvmCross
【发布时间】:2014-01-08 02:54:38
【问题描述】:

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();

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

【问题讨论】:

    标签: c# wpf xamarin mvvmcross


    【解决方案1】:

    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();
    

    这应该为您提供调试/跟踪输出,并且应该为您提供一个放置断点的地方以稍微了解调用堆栈(尽管预计这会包含许多难以阅读的反射)。

    除此之外:

    【讨论】:

    • 谢谢斯图尔特。所以这确实有效,你是对的。似乎有问题的属性是被绑定在子视图模型中的 Pressed 属性 [link]stackoverflow.com/questions/17926975/…(在 Android 上)。我将继续研究这一点,调试器会命中属性的 getter,但永远不会命中 setter,即使我使用双向模式也是如此。但其他嵌套属性都按我的预期工作。谢谢!
    猜你喜欢
    • 2017-05-05
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    相关资源
    最近更新 更多