WPF Binding parent property in HierarchicalDataTemplate
I have a WPF TreeView
with 2 levels of data and 2 HierarchicalDataTemplate
开发者_C百科to format each level. From the HierarchicalDataTemplate
at the second level, I need to bind a property in the class of the first level. I have tried in this way, but it dosn't work:
Text="{Binding Path=Ori, RelativeSource={RelativeSource TemplatedParent}}"
with Ori
as the name of the propery
Even in this way it dosn't works:
Text="{Binding Path=tOri, RelativeSource={RelativeSource TemplatedParent}}"
with tOri
as the name of the TextBlock
in the fisrt HierarchicalDataTemplate
that bind the Ori
propery.
Can you help me?
TemplatedParent only refers to the parent Control inside a ControlTemplate and so doesn't work with DataTemplates. You can use FindAncestor instead to locate the parent TreeViewItem and then access its DataContext.
Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}, AncestorLevel=2}, Path=DataContext.Ori}"
You have misunderstood the TemplatedParent
binding in WPF. TemplatedParent
refers to the inherited control that you are extending. Example: if I wrote a ControlTemplate
that targeted a Button
.
<ControlTemplate TargetType="{x:Type Button}" x:Key="MyButtonTemplate">
<Border BorderBrush="{TemplateBinding Property=Background}" BorderThickness="3" >
<ContentPresenter Margin="10"/>
</Border>
</ControlTemplate>
This is binding the BorderBrush
to the the base Button.Background
property.
To achieve what you want, you need to walk the visual tree using the RelativeSource FindAncestor
to find the parent and then perform the binding. To help try using either Mole WPF or Snoop.
Note: the copy of Snoop available above has some serious issues, i.e., cannot go more than 256-levels deep. I have a patched and feature extended version that is awesome. A interchange between using Mole and Snoop2 to debug/visualise during development.
精彩评论