我有一个WPF TreeView
,包含2个级别的数据,2个HierarchicalDataTemplate
来格式化每个级别。从第二级HierarchicalDataTemplate
开始,我需要在第一级的类中绑定一个属性。我试过这种方式,但它不起作用:
Text="{Binding Path=Ori, RelativeSource={RelativeSource TemplatedParent}}"
以Ori
为名称
即使以这种方式它也不起作用:
Text="{Binding Path=tOri, RelativeSource={RelativeSource TemplatedParent}}"
tOri
作为绑定TextBlock
属性的f HierarchicalDataTemplate
中Ori
的名称。
你能帮助我吗?
答案 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 WPF或Snoop。
注意:上面提供的Snoop副本存在一些严重问题,即不能超过256级。我有一个非常棒的补丁和功能扩展版本。在开发过程中使用Mole和Snoop2进行调试/可视化之间的交换。