2009-08-24 3 views
5

Voici le code:RelativeSource FindAncestor question

<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> 

En fait ce que je suis en train de faire est de faire le TextBlock dans l'en-tête suivent la largeur de la colonne entière.

Cela ne fonctionne pas: la largeur du bloc de texte correspond toujours au texte à l'intérieur. Des idées? ... Merci d'avance!

Répondre

14

Il y a deux problèmes dans votre code

  1. le GridViewColumn est pas un ancêtre visuel de la zone de texte, son ancêtre est un GridViewColumnHeader
  2. Vous devez lier au ActualWidth du GridViewColumnHeader, pas la largeur (si la largeur n'est pas spécifié, il sera un numéro non valide)

Alors votre code devient:

   <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>