首页 > 解决方案 > 在 DataTemplate 中绑定用户控件 Datacontext

问题描述

我在 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;
    }
}

现在,两种可能的 ViewModelChildViewModelLayersViewModelUserDrawnLayersViewModel。当我更改ChildViewModel为其中之一时,视图会通过DataTemplate. 但DataContext实际上并没有设置。没有任何东西被束缚。我尝试为 MainLayerTabViewModel 中的每个 ViewModel 创建单独的属性,并将DataContext每个视图的属性绑定到它自己的属性,但这也不起作用。

标签: wpfmvvmdatatemplatedatacontext

解决方案


我尚未对此进行验证,但是我可以看到您的代码存在一些问题。

视图应该是

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

希望有帮助..


推荐阅读