2010-07-15 2 views
5

У меня есть WPF TreeView с 2 уровнями данных и 2 HierarchicalDataTemplate для форматирования каждого уровня. От HierarchicalDataTemplate на втором уровне мне нужно связать свойство в классе первого уровня. Я попытался таким образом, но это dosn't работы:WPF Связывание родительского свойства в HierarchicalDataTemplate

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

с Ori как имя Собственость

Даже в этом случае она dosn't работы:

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

с tOri как имя TextBlock в fisrt HierarchicalDataTemplate, которые связывают свойство Ori.

Вы можете мне помочь?

ответ

9

TemplatedParent относится только к родительскому элементу управления внутри ControlTemplate и поэтому не работает с DataTemplates. Вместо этого вы можете использовать FindAncestor для поиска родительского TreeViewItem, а затем доступа к его DataContext.

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

Спасибо! Я попробовал ваше решение, но это не сработало, потому что я не знал, что мне нужно написать «AncestorLevel = 2» – lamarmora

0

Вы поняли TemplatedParent привязки в WPF. 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 для отладки/визуализации во время разработки.

+1

Самая новая версия Snoop находится по адресу http://snoopwpf.codeplex.com/ и содержит все комбинированные исправления из других версий там в дополнение к поддержке 32 и 64 бит и .NET 4. Будьте осторожны с запутыванием TemplateBinding с RelativeSource TemplatedParent. Они являются отдельными механизмами, которые выполняют аналогичные действия, но TemplateBinding гораздо более ограничивает то, что он может указывать только на свойство типа соответствия для родителя и не имеет ни одного из других параметров, доступных для Binding (преобразователи, сложные пути и т. Д.), , –

+0

@John: Спасибо за обновление на Snoop; Я буду захватывать последние и интегрироваться в свою ветку - возможно, есть исправления/функции, которые я могу внести. – Dennis

+0

@John: Да, я должен был объяснить разницу между ними. «TemplateBinding» гораздо более ограничен, как вы объяснили, и он разрешен во время компиляции, тогда как «RelativeSource TemplatedParent» разрешен во время выполнения (с использованием механизма привязки). – Dennis

Смежные вопросы