HierarchicalDataTemplate中的WPF绑定父属性

时间:2010-07-15 12:08:11

标签: wpf binding properties parent hierarchicaldatatemplate

我有一个WPF TreeView,包含2个级别的数据,2个HierarchicalDataTemplate来格式化每个级别。从第二级HierarchicalDataTemplate开始,我需要在第一级的类中绑定一个属性。我试过这种方式,但它不起作用:

Text="{Binding Path=Ori, RelativeSource={RelativeSource TemplatedParent}}"

Ori为名称

即使以这种方式它也不起作用:

Text="{Binding Path=tOri, RelativeSource={RelativeSource TemplatedParent}}"

tOri作为绑定TextBlock属性的f HierarchicalDataTemplateOri的名称。

你能帮助我吗?

2 个答案:

答案 0 :(得分:9)

TemplatedParent仅引用ControlTemplate中的父Control,因此不能与DataTemplates一起使用。您可以使用FindAncestor来定位父TreeViewItem,然后访问其DataContext。

Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}, AncestorLevel=2}, Path=DataContext.Ori}"

答案 1 :(得分:0)

您误解了WPF中的TemplatedParent绑定。 TemplatedParent指的是您扩展的继承控件。示例:如果我写了一个以ControlTemplate为目标的Button

<ControlTemplate TargetType="{x:Type Button}" x:Key="MyButtonTemplate">
   <Border BorderBrush="{TemplateBinding Property=Background}" BorderThickness="3" >
      <ContentPresenter Margin="10"/>
   </Border>
</ControlTemplate>

这会将BorderBrush绑定到基本Button.Background属性。

要实现您的目标,您需要使用RelativeSource FindAncestor遍历可视树以查找父级,然后执行绑定。为了帮助您尝试使用Mole WPFSnoop

注意:上面提供的Snoop副本存在一些严重问题,即不能超过256级。我有一个非常棒的补丁和功能扩展版本。在开发过程中使用Mole和Snoop2进行调试/可视化之间的交换。