2010-01-06 9 views
0

J'essaie de personnaliser le contrôle TreeView. Lorsqu'un utilisateur sélectionne un élément dans la TreeView, j'ai besoin ActualWidth du SelectedItem à stocker dans la balise de l'élément:Problèmes de liaison WPF

<Style x:Key="{x:Type TreeViewItem}" TargetType="{x:Type TreeViewItem}"> 
      <!-- ... --> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type TreeViewItem}"> 
         <Grid ShowGridLines="True"> 

          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="Auto" /> 
           <ColumnDefinition /> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition /> 
           <RowDefinition /> 
          </Grid.RowDefinitions> 

          <Rectangle x:Name="rect" /> 

          <ContentPresenter x:Name="PART_Header" ContentSource="Header" Margin="5" />   

          <ItemsPresenter x:Name="ItemsHost" Grid.Row="1" Grid.Column="1" /> 
          <!-- ... -->  
         </Grid> 

         <ControlTemplate.Triggers> 
          <Trigger Property="IsSelected" Value="true"> 
           <Setter Property="Tag" Value="{Binding ElementName=rect, Path=ActualWidth}" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

Plus tard, j'écoute l'événement SelectedItemChanged du TreeView:

private void views_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
     TreeViewItem item = (TreeViewItem)e.NewValue; 
     double i = (double)item.Tag; 
    } 

Maintenant, le problème est que item.Tag est toujours nul. Est-ce un problème avec ma liaison? Ou devrait-on faire les choses différemment?

+0

Essayez de regarder dans la fenêtre de sortie pour produire des erreurs de liaison – arconaut

+0

Il n'y a pas de données erreurs de liaison signalées. – Austin

+0

apparemment, il n'est pas possible par ElementName: http://stackoverflow.com/questions/705853/binding-elementname-does-it-use-visual-tree-or-logical-tree. Et il n'y a pas d'extension de balisage 'FindVisualChildByType'. Par conséquent, vous avez besoin d'une autre solution de contournement. Quel problème essayez-vous de résoudre? – jonny

Répondre

1

Essayez que:

<Setter Property="Tag" Value="{Binding Path=ActualWidth, RelativeSource={x:Static RelativeSource.Self}}" /> 
+0

Celui-ci fonctionne mais il ne me donne pas la valeur dont j'ai besoin - c'est la liaison à la largeur réelle de l'élément, qui est égale à la largeur de la TreeView où il sera placé. Si je veux l'ActualWidth du contenu de l'article, j'ai besoin de le lier soit au rectangle 'rect' soit à la définition de la première colonne. – Austin