У меня есть WPF TreeView
с 2 уровнями данных и 2 HierarchicalDataTemplate
отформатировать каждый уровень. От HierarchicalDataTemplate
на втором уровне я должен связать свойство в классе первого уровня. Я попробовал таким образом, но это работа dosn't:
Text="{Binding Path=Ori, RelativeSource={RelativeSource TemplatedParent}}"
с Ori
как название propery
Даже таким образом это работы dosn't:
Text="{Binding Path=tOri, RelativeSource={RelativeSource TemplatedParent}}"
с tOri
как название TextBlock
в fisrt HierarchicalDataTemplate
это связывает Ori
propery.
Можно ли помочь мне?
TemplatedParent относится только к родительскому Control внутри ControlTemplate и поэтому не работает с DataTemplates. Вместо этого можно использовать FindAncestor, чтобы найти родительский TreeViewItem и затем получить доступ к его DataContext.
Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}, AncestorLevel=2}, Path=DataContext.Ori}"
Вы неправильно поняли привязку TemplatedParent
в WPF. TemplatedParent
относится к унаследованному элементу управления, который вы расширяете . Пример: если я написал ControlTemplate
, предназначенный для кнопки
.
<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 для отладки / визуализации во время разработки.