2010-07-15 21 views
5

Ho un WPF TreeView con 2 livelli di dati e 2 HierarchicalDataTemplate per formattare ogni livello. Dal HierarchicalDataTemplate al secondo livello, ho bisogno di associare una proprietà alla classe del primo livello. Ho cercato in questo modo, ma dosn't lavoro:WPF Associazione proprietà Binding in HierarchicalDataTemplate

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

con Ori come il nome del propery

Anche in questo modo si dosn't opere:

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

con tOri come il nome dello nel primo Ori propery.

Potete aiutarmi?

risposta

9

TemplatedParent si riferisce solo al controllo genitore in un oggetto ControlTemplate e pertanto non funziona con DataTemplates. È possibile utilizzare FindAncestor invece per individuare TreeViewItem padre e quindi accedere a DataContext.

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

Grazie! Ho provato la tua soluzione ma non ha funzionato perché non sapevo di dover scrivere "AncestorLevel = 2" – lamarmora

0

Hai frainteso il TemplatedParent binding in WPF. TemplatedParent si riferisce al controllo ereditato che si è che si estende. Esempio: se ho scritto un ControlTemplate che ha come target un Button.

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

Questo vincola il BorderBrush al Button.Background struttura base.

Per ottenere ciò che si desidera, è necessario percorrere l'albero visivo utilizzando RelativeSource FindAncestor per trovare il genitore e quindi eseguire l'associazione. Per provare a utilizzare Mole WPF o Snoop.

Nota: la copia di Snoop disponibile sopra presenta alcuni problemi gravi, vale a dire, non può superare più di 256 livelli. Ho una versione estesa con patch e funzionalità che è fantastica. Uno scambio tra l'utilizzo di Mole e Snoop2 per il debug/visualizzazione durante lo sviluppo.

+1

La versione più recente di Snoop è http://snoopwpf.codeplex.com/ e contiene tutte le correzioni combinate dalle altre versioni là fuori, oltre al supporto a 32 e 64 bit e .NET 4. Fai attenzione a confondere TemplateBinding con RelativeSource TemplatedParent. Sono meccanismi separati che fanno cose simili ma TemplateBinding è molto più restrittivo in quanto può solo puntare a una proprietà di tipo corrispondente sul genitore e non ha nessuna delle altre opzioni disponibili su Binding (Convertitori, percorsi complessi, ecc.) . –

+0

@ John: Grazie per l'aggiornamento su Snoop; Prenderò l'ultimo e l'integrazione nel mio ramo - forse ci sono correzioni/funzionalità che posso contribuire. – Dennis

+0

@ John: Sì, avrei dovuto spiegare la differenza tra i due. 'TemplateBinding' è molto più limitato, come hai spiegato, ed è risolto in fase di compilazione mentre' RelativeSource TemplatedParent' viene risolto in fase di runtime (usando il motore Binding). – Dennis

Problemi correlati