2010-07-14 51 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);