2009-08-24 14 views
5

Aquí está el código:RelativeSource FindAncestor

<GridViewColumn DisplayMemberBinding="{Binding Path=BookId}" Width="100"> 
    <GridViewColumn.Header> 
     <Border BorderBrush="Black"> 
      <TextBlock Width="{Binding RelativeSource= 
             {RelativeSource FindAncestor, 
             AncestorType={x:Type GridViewColumn}}, 
             Path=Width}" Text="ID"> 
       <TextBlock.ContextMenu> 
        <ContextMenu>item1</ContextMenu> 
       </TextBlock.ContextMenu> 
      </TextBlock> 
      </Border> 
    </GridViewColumn.Header> 
</GridViewColumn> 

Básicamente lo que estoy tratando de hacer es hacer TextBlock en la cabecera sigue el ancho de toda la columna.

No funciona: el ancho del bloque de texto siempre coincide con el texto dentro. ¿Alguna idea? ... ¡Gracias de antemano!

Respuesta

14

Hay dos problemas en su código

  1. la GridViewColumn no es un ancestro visual del cuadro de texto, su ancestro es un GridViewColumnHeader
  2. Debe unirse al ActualWidth del GridViewColumnHeader, no el ancho (si no se especifica ancho, será un número no válido)

lo que el código se convierte en:

   <GridViewColumn 
          DisplayMemberBinding="{Binding Path=BookId}" 
          Width="100"> 
       <GridViewColumn.Header> 
        <Border BorderBrush="Black" > 
         <TextBlock Text="ID" Width="{Binding RelativeSource= 
                 {RelativeSource FindAncestor, 
                 AncestorType={x:Type GridViewColumnHeader}}, 
                 Path=ActualWidth}"> 
          <TextBlock.ContextMenu> 
           <ContextMenu>item1</ContextMenu> 
          </TextBlock.ContextMenu> 
         </TextBlock> 
         </Border> 
       </GridViewColumn.Header> 
      </GridViewColumn> 
Cuestiones relacionadas