2009-08-24 4 views
5

Hier ist der Code:Relative FindAncestor Ausgabe

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

Im Grunde, was ich versuche zu tun, den Textblock in der Kopfzeile folgt der Breite der gesamten Spalte zu machen.

Es funktioniert nicht: die Breite des Textblocks stimmt immer mit dem darin enthaltenen Text überein. Irgendwelche Ideen? ... Vielen Dank im Voraus!

Antwort

14

Es gibt zwei Probleme im Code

  1. die Gridviewcolumn ist kein visuelles Vorfahren des TextBox, ist seine Vorfahren ein Gridviewcolumnheader
  2. Sie auf die Actual des Gridviewcolumnheader binden sollte, nicht die Breite (wenn Breite nicht angegeben ist, wird es eine ungültige Nummer sein)

So Ihr Code wird:

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