一个视图可以有两个视图模型作为其数据上下文吗?
问题描述:
我在一个视图中有两个数据网格,但这些数据网格的ItemsSource集合在不同的视图模型中。那么是否有可能将这两个数据网格与两个不同视图模型中的集合绑定?一个视图可以有两个视图模型作为其数据上下文吗?
答
去一个视图模型结合两种:
public class ViewModelA {
public ObservableCollection<CustomClass> Items { get; set; }
/* properties, etc. */
}
public class ViewModelB {
/* properties, etc. */
}
public class CombiningViewModel {
public ViewModelA A { get; set; }
public ViewModelB B { get; set; }
}
结合可以像
完成<DataGrid ItemsSource="{Binding A.Items}">
<!-- Sample, not complete -->
</DataGrid>
答
您可以为每个DataGrid而不是容器视图设置DataContext。
<Grid>
<DataGrid ... DataContext="..." />
<DataGrid ... DataContext="..." />
</Grid>
或者不使用的DataContext并绑定到模型直接
<DataGrid ItemsSource="{Binding Source={StaticResource ...}}" />
答
不,不是直接。你有选择,但:
你可以设置视图本身的DataContext的,然后暴露每个视图模型通过一个单独的属性并绑定到这些属性:
public class MyView : Window
{
public MyView()
{
this.DataContext = this;
}
public ViewModel1 FirstViewModel { get; set; }
public ViewModel2 SecondViewModel { get; set; }
}
或者你可以做一个包装视图模型,其或者扩展(继承自其中一个视图模型),或者将它们包装并表面适当的属性:
public class MyCompositeViewModel
{
public ViewModel1 FirstViewModel { get; set; }
public ViewModel2 SecondViewModel { get; set; }
}
+1我也将在这个实例中使用复合ViewModel。 –