在 DataTemplate 中绑定用户控件 Datacontext

Binding usercontrols Datacontext in DataTemplate

我在 TabItem 中有两个用户控件。 TabItem 有它自己的 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 绑定到它自己的 属性,但这也不起作用。

我还没有验证这一点,但是我可以看到你的代码有几个问题。

视图应该是

<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>

视图模型:

public class MainLayerTabViewModel : ViewModelBase
{
    public ViewModelBase ChildViewModel { get; set; }

    public MainLayerTabViewModel()
    {
        ChildViewModel = new LayersViewModel();
        //or ChildViewModel = new UserDrawnLayersViewModel();
    }
}

希望对您有所帮助..