0

如果它们位于分层数据模板中,如何在代码中获取组成 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 作为源的事件时,我希望能够获得 local:RenamingNode,但我无法获得 TreeViewItem 的后代。

谢谢,

伊利亚

4

4 回答 4

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; 
} 
于 2012-09-28T01:53:10.523 回答
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上的方法手动遍历可视化树。

于 2010-07-15T02:40:25.980 回答
1

我假设这在 WPF 中与 silverlight 相同(这是 silverlight 版本)

(treeViewItem.HeaderTemplate.LoadContent() as StackPanel).FindName("RenamableNode")
于 2010-07-24T11:23:41.240 回答
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);
于 2013-05-03T10:20:14.193 回答