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();
这应该有用吗?它似乎不起作用,但输出中没有绑定错误?
答案 0 :(得分:3)
mvvmcross本身是否支持绑定到嵌套属性?
是
这应该有用吗?
是
例如,ApiExamples for Xamarin.iOS中的这一行正在运行:
set.Bind(errorLabel2).To(vm => vm.Errors.Count);
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();
这应该给你调试/跟踪输出,并且应该给你一个断点来理解调用堆栈的地方(尽管期望这包含很多反射,这很难通读)。
超越这个:
MvxBindingTrace.TraceBindingLevel
https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Binding/MvxBindingTrace.cs#L14)