2010-07-14 50 views
0

如何获取构成TreeViewItem的组成控件,如果它们在hierarichicaldatatemplate中?WPF:获取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> 

所以编程时,我得到一个事件有一个TreeViewItem为源,我希望能够得到地方:RenamingNode,但我不能让TreeViewItem的后裔。

感谢,

伊利亚

回答

1

您可以使用FrameworkTemplate.FindName来查找TreeView项控制模板标题内容展示器,然后再次找到数据模板您需要的部分。

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

您也可以使用VisualTreeHelper上的方法手动移动可视化树。

+0

这不起作用,因为头不具有的ContentTemplate。 – 2011-10-26 03:24:13

1

我假定这将是相同的WPF的Silverlight的(这是Silverlight的版本)

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

提问者需要为特定的TreeViewItem找到指定的实例。你将会返回一个不正确的新实例的名称实例。 – 2011-10-26 03:25:22

2

这为我工作。毫无疑问,一如既往,有更好的方法,你会无疑添加额外的检查,例如检查Child(ren)计数和/或获取/检查循环中的儿童类型/名称等,但基本技术的工作原理,虽然我有一个Grid而不是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

以上都不是解决方案在Silverlight ,但这似乎工作。

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

继码

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