2010-07-15 7 views
5

Tengo un WPF TreeView con 2 niveles de datos y 2 HierarchicalDataTemplate para formatear cada nivel. Desde el HierarchicalDataTemplate en el segundo nivel, debo vincular una propiedad en la clase del primer nivel. He tratado de esta manera, pero dosn't trabajo:WPF Vinculación de la propiedad primaria en HierarchicalDataTemplate

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

con Ori como el nombre del hotel fenomenal

Incluso de esta manera dosn't obras:

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

con tOri como el nombre del TextBlock en el fisrt HierarchicalDataTemplate que enlaza la propiedad Ori.

¿Me puede ayudar?

Respuesta

9

TemplatedParent solo se refiere al control principal dentro de una plantilla ControlTemplate y por lo tanto no funciona con DataTemplates. Puede usar FindAncestor en su lugar para localizar el TreeViewItem padre y luego acceder a su DataContext.

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

¡Gracias! Intenté su solución pero no funcionó porque no sabía que tenía que escribir "AncestorLevel = 2" – lamarmora

0

Has entendido mal el TemplatedParent vinculante en WPF. TemplatedParent se refiere al control heredado que usted es extendiendo. Ejemplo: si escribí un ControlTemplate que tenía como objetivo un Button.

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

Esta es la unión del BorderBrush a la propiedad Button.Background la base.

Para lograr lo que desea, debe recorrer el árbol visual utilizando el RelativeSource FindAncestor para buscar el elemento primario y luego realizar el enlace. Para ayudarlo, intente utilizar Mole WPF o Snoop.

Nota: la copia de Snoop disponible arriba tiene algunos problemas graves, es decir, no puede ir a más de 256 niveles de profundidad. Tengo un parche y una versión extendida que es increíble. Un intercambio entre el uso de Mole y Snoop2 para depurar/visualizar durante el desarrollo.

+1

La versión más reciente de Snoop está en http://snoopwpf.codeplex.com/ y tiene todas las correcciones combinadas de las otras versiones, además del soporte de 32 y 64 bits y .NET 4. Tenga cuidado al confundir TemplateBinding con RelativeSource TemplatedParent. Son mecanismos independientes que hacen cosas similares, pero TemplateBinding es mucho más restrictivo ya que solo puede apuntar a una propiedad de tipo coincidente en el elemento primario y no tiene ninguna de las otras opciones disponibles en Binding (convertidores, rutas complejas, etc.) . –

+0

@John: Gracias por la actualización de Snoop; Voy a tomar lo último e integrarme en mi sucursal; tal vez haya soluciones/funciones a las que pueda contribuir. – Dennis

+0

@John: Sí, debería haber explicado la diferencia entre los dos. 'TemplateBinding' es mucho más limitado, como ha explicado, y se resuelve en tiempo de compilación, mientras que' RelativeSource TemplatedParent' se resuelve en tiempo de ejecución (utilizando el motor de enlace). – Dennis

Cuestiones relacionadas