2010-07-15 3 views
5

J'ai un WPF TreeView avec 2 niveaux de données et 2 HierarchicalDataTemplate pour mettre en forme chaque niveau. De la HierarchicalDataTemplate au deuxième niveau, j'ai besoin de lier une propriété dans la classe du premier niveau. J'ai essayé de cette façon, mais il dosn't travail:Propriété parent de liaison WPF dans HierarchicalDataTemplate

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

avec Ori comme le nom du propery

Même dans cette façon, il dosn't œuvres:

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

avec tOri comme nom du TextBlock dans le fichier HierarchicalDataTemplate qui lie la propriété Ori.

Pouvez-vous m'aider? TemplatedParent se réfère uniquement au contrôle parent dans un ControlTemplate et ne fonctionne donc pas avec DataTemplates.

Répondre

9

Vous pouvez utiliser FindAncestor à la place pour localiser le TreeViewItem parent et accéder à son DataContext.

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

Merci! J'ai essayé votre solution mais cela n'a pas fonctionné parce que je ne savais pas que je devais écrire "AncestorLevel = 2" – lamarmora

0

Vous avez mal compris la TemplatedParent obligatoire dans WPF. TemplatedParent fait référence au contrôle hérité que vous êtes s'étendant. Exemple: si j'ai écrit un ControlTemplate qui visait un Button.

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

Ce lie la BorderBrush à la propriété, la base Button.Background.

Pour obtenir ce que vous voulez, vous devez parcourir l'arborescence visuelle en utilisant le RelativeSource FindAncestor pour trouver le parent, puis effectuer la liaison. Pour essayer d'utiliser soit Mole WPF ou Snoop. Remarque: la copie de Snoop disponible ci-dessus présente de sérieux problèmes, c'est-à-dire qu'elle ne peut pas dépasser 256 niveaux de profondeur. J'ai une version corrigée et fonctionnelle étendue qui est génial. Un échange entre l'utilisation de Mole et Snoop2 pour déboguer/visualiser pendant le développement.

+1

La dernière version de Snoop est à http://snoopwpf.codeplex.com/ et a tous les correctifs combinés à partir des autres versions là-bas en plus de la prise en charge 32 et 64 bits et .NET 4. Faites attention à ne pas confondre TemplateBinding avec RelativeSource TemplatedParent. Ce sont des mécanismes séparés qui font des choses similaires mais TemplateBinding est beaucoup plus restrictif en ce sens qu'il ne peut pointer que vers une propriété de type correspondant sur le parent et n'a aucune des autres options disponibles sur Binding (Convertisseurs, chemins complexes, etc) . –

+0

@John: Merci pour la mise à jour sur Snoop; Je vais prendre le dernier et intégrer dans ma branche - peut-être y a-t-il des correctifs/fonctionnalités que je peux apporter. – Dennis

+0

@John: Oui, j'aurais dû expliquer la différence entre les deux. 'TemplateBinding' est beaucoup plus limité, comme vous l'avez expliqué, et il est résolu au moment de la compilation alors que RelativeSource TemplatedParent' est résolu à l'exécution (en utilisant le moteur de liaison). – Dennis

Questions connexes