如果它们在一个层次化的数据模板中,如何在代码中获得构成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的后代。
谢谢,
伊利亚安德
答案 0 :(得分:2)
这对我有用。毫无疑问,有一个更好的方法,一如既往,你无疑会添加额外的检查,如检查子(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;
}
答案 1 :(得分: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上的方法手动浏览可视树。
答案 2 :(得分:1)
答案 3 :(得分: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);