2010-07-14 3 views
0

Comment puis-je obtenir les contrôles constituants composant le TreeViewItem dans le code s'ils se trouvent dans un modèle hiérarchique?WPF: Obtenir les contrôles constituants de TreeViewItem

<HierarchicalDataTemplate DataType="{x:Type local:Module}" ItemsSource="{Binding Children}"> 
    <StackPanel Orientation="Horizontal"> 
     <Image Width="16" Height="16" Margin="3,0" Source="Images\module.ico" /> 
     <local:RenamingNode Name="RenamableNode" Text="{Binding Name}" VstaObject="{Binding BindsDirectlyToSource=True}" OnRename="OnRenameOccured" /> 
    </StackPanel> 
</HierarchicalDataTemplate> 

Alors programatically quand je reçois un événement avec un TreeViewItem comme source, je veux être en mesure d'obtenir local: RenamingNode, mais je ne peux pas les descendants du TreeViewItem.

Merci,

Ilya

Répondre

1

Vous pouvez utiliser FrameworkTemplate.FindName pour trouver le présentateur de contenu d'en-tête dans le modèle de contrôle d'élément TreeView, puis à nouveau pour trouver la partie que vous voulez dans le modèle de données.

private object FindContentTemplatePart(TreeViewItem treeViewItem) 
{ 
    if (treeViewItem != null) 
    { 
     var header = treeViewItem.Template.FindName("PART_Header", treeViewItem) as ContentPresenter; 
     if (header != null) 
     { 
      return header.ContentTemplate.FindName("RenamableNode", header); 
     } 
    } 
    return null; 
} 

Vous pouvez aussi marcher l'arbre visuel manuellement avec les méthodes sur VisualTreeHelper.

+0

Cela ne fonctionne pas parce que l'en-tête n'a pas ContentTemplate. –

1

Je suppose que ce sera la même chose dans WPF comme silverlight (ce qui est la version silverlight)

(treeViewItem.HeaderTemplate.LoadContent() as StackPanel).FindName("RenamableNode") 
+0

Le questionneur doit trouver l'instance nommée pour un TreeViewItem particulier. La vôtre donnerait une instance de nom pour une nouvelle instanciation qui n'est pas correcte. –

2

Cela a fonctionné pour moi. Sans doute il y a un meilleur moyen, comme toujours, et vous ajouterez sans doute des contrôles supplémentaires tels que vérifier le nombre d'enfants et/ou obtenir/vérifier le type/nom des enfants dans une boucle etc. mais la technique de base fonctionne bien fait dans mon application bien que j'ai une grille au lieu d'un StackPanel.

private object FindContentTemplatePart(TreeViewItem treeViewItem) 
{ 
    if (treeViewItem != null) 
    { 
     var header = (ContentPresenter)treeViewItem.Template.FindName("PART_Header", treeViewItem); 

     if (header != null) 
     { 
      StackPanel stackPanel = (StackPanel)VisualTreeHelper.GetChild(header,0); 

      return stackPanel.Children[2]; 
     } 
    } 
    return null; 
} 
0

Aucune des solutions ci-dessus fonctionne dans Silverlight mais cela semble fonctionner.

<common:HierarchicalDataTemplate x:Key="myHierarchicalTemplate" ItemsSource="{Binding Children}" > 
     <StackPanel x:Name="spTreeItem" Height="23" Margin="0,0,0,0" HorizontalAlignment="Stretch" Orientation="Horizontal"> 

     </StackPanel> 
    </common:HierarchicalDataTemplate> 

Après le code

TreeViewItem item = TreeViewWorkarounds.ContainerFromItem(trtFolders, trtFolders.SelectedItem); 
Grid ItemGrid = (Grid) VisualTreeHelper.GetChild(item, 0); 
Button ItemGridButton = (Button)VisualTreeHelper.GetChild(ItemGrid, 2); 
Grid ButtonGrid = (Grid)VisualTreeHelper.GetChild(ItemGridButton, 0); 
ContentPresenter CP = (ContentPresenter)VisualTreeHelper.GetChild(ButtonGrid, 1); 
ContentPresenter CPchlild = (ContentPresenter)VisualTreeHelper.GetChild(CP, 0); 
StackPanel sp = (StackPanel)VisualTreeHelper.GetChild(CPchlild, 0); 
Questions connexes