为什么我的DataContext从我下面切换出来绑定?

  • 本文关键字:换出 绑定 DataContext c# wpf xaml
  • 更新时间 :
  • 英文 :


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

PropertyGrid有一种方法可以改变标签头的显示方式,通过将DataTemplate传递给它的TabHeaderTemplate属性。但是在模板内部发生了一些奇怪的事情:我的DataContext消失了,被其他东西取代。当我试图在上下文中的适当位置说{Binding TabName}时,它会出错并告诉我TabName不是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中的绑定!

在这种情况下,只需确保在绑定中指定源即可。有几种方法可以做到这一点。一种是使用绑定的RelativeSource属性。另一种是使用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}"/>

最新更新