【问题标题】:Binding usercontrols Datacontext in DataTemplate在 DataTemplate 中绑定用户控件 Datacontext
【发布时间】:2019-02-14 01:49:51
【问题描述】:

我在 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 绑定到它自己的属性,但这也不起作用。

【问题讨论】:

  • LayersViewModel 是如何实现的?它有ChildViewModel 属性吗? LayersTabViewDataContext 不应该是 LayersViewModel 本身吗?那么你应该删除DataContext="{Binding ChildViewModel}"
  • 是的,就是这样!谢谢。

标签: wpf mvvm datatemplate datacontext


【解决方案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>

视图模型:

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

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

希望对您有所帮助..

【讨论】:

  • 就是这样!一旦我从 DataTemplates 中删除了DataContext,它就起作用了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-05-21
  • 2011-11-27
  • 1970-01-01
  • 2011-11-22
  • 2018-11-25
  • 2016-07-05
  • 2014-07-30
  • 1970-01-01
相关资源
最近更新 更多