我在TabItem内部有两个用户控件。 TabItem拥有自己的ViewModel,该ViewModel具有TabItem的子ContentControl内容绑定到的属性。此属性表示另一个视图模型,它将根据视图模型的不同来更改视图。这是一个示例:
<TabItem DataContext="{Binding Path=MainLayerTabViewModel, Source={StaticResource ViewModelLocator}}" Header="Layers">
<ContentControl Content="{Binding ChildViewModel}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type vm:LayersViewModel}">
<views:LayersTabView DataContext="{Binding ChildViewModel}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:UserDrawnLayersViewModel}">
<views:AlternateLayersTabView DataContext="{Binding ChildViewModel}" />
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
以下是用作Tabitem的数据上下文的视图模型:
public class MainLayerTabViewModel : ViewModelBase
{
public object ChildViewModel { get; set; }
public MainLayerTabViewModel()
{
ChildViewModel = (App.Current.Resources["ViewModelLocator"] as ViewModelLocator).LayersViewModel;
}
}
现在,ChildViewModel
的两种可能的ViewModel类型是LayersViewModel
和UserDrawnLayersViewModel
。当我将ChildViewModel
更改为其中之一时,可以通过DataTemplate
正确地切换视图。但是实际上并未设置DataContext
。什么都没有约束。我尝试为MainLayerTabViewModel中的每个ViewModel创建单独的属性,并将每个视图的DataContext
绑定到其自己的属性,但是那也不起作用。
答案 0 :(得分:1)
我尚未验证这一点,但是我可以看到您的代码有几个问题。
视图应为
<ContentControl Content="{Binding ChildViewModel}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type vm:LayersViewModel}">
<views:LayersTabView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:UserDrawnLayersViewModel}">
<views:AlternateLayersTabView/>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
ViewModel:
public class MainLayerTabViewModel : ViewModelBase
{
public ViewModelBase ChildViewModel { get; set; }
public MainLayerTabViewModel()
{
ChildViewModel = new LayersViewModel();
//or ChildViewModel = new UserDrawnLayersViewModel();
}
}
希望有帮助。