首页 > 解决方案 > 为什么我的 DataContext 会从我下面切换出来进行绑定?

问题描述

我正在尝试使用PropertyToolsPropertyGrid中的组件来显示对象的信息。我可以很容易地绑定对象——它是我的 DataContext 上的一个属性——但是不能从对象派生的东西之一是应该显示在选项卡标题中的名称。(而且我无法更改它;我正在检查的对象来自第三方。)正确的名称是我的 DataContext 上的不同属性。

PropertyGridDataTemplate有一种方法可以通过将 a 传递给其TabHeaderTemplate属性来更改选项卡标题的显示方式。但是模板内部发生了一些奇怪的事情:我的 DataContext 不见了,取而代之的是别的东西。当我尝试{Binding TabName}在上下文中的适当位置说时,它会出错并告诉我这TabName不是 class 上的有效属性Tab。但是我的DataContext课没有被调用Tab;这是 PropertyTools 代码库中的内容!

我还是 WPF 的新手,所以我不知道这里发生了什么。为什么在这个模板中从我下方提取的 XAML 文件的其余部分中完全有效的范围内 DataContext 是完全有效的,我该如何修复它?

编辑:按要求发布 XAML。模板实际上只是最简单的事情:

<UserControl.Resources>
    <DataTemplate x:Key="HeaderTemplate">
        <TextBlock Text="{Binding TabName}" />
    </DataTemplate>
</UserControl.Resources>

然后在页面的下方,

    <props:PropertyGrid
        SelectedObject="{Binding Value}"
        TabHeaderTemplate="{StaticResource HeaderTemplate}" />

但是出于某种奇怪的原因,在模板中它试图解释错误 DataContext 中的绑定!

标签: c#wpfxaml

解决方案


在这种情况下,只需确保在绑定中指定源即可。有几种方法可以做到这一点。一种是使用RelativeSourceBinding的属性。另一种是使用ElementName

给你的 UserControl 这个属性:

x:Name="Root".

然后更改您的绑定以使用它

<TextBlock Text="{Binding ElementName=Root, Path=DataContext.TabName}" />

或者使用这个:

 <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MyUserControl}}, Path=DataContext.TabName}"/>

推荐阅读