在DataTemplate

时间:2019-02-14 01:49:51

标签: wpf mvvm datatemplate datacontext

我在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类型是LayersViewModelUserDrawnLayersViewModel。当我将ChildViewModel更改为其中之一时,可以通过DataTemplate正确地切换视图。但是实际上并未设置DataContext。什么都没有约束。我尝试为MainLayerTabViewModel中的每个ViewModel创建单独的属性,并将每个视图的DataContext绑定到其自己的属性,但是那也不起作用。

1 个答案:

答案 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();
    }
}

希望有帮助。