WPF:获取TreeViewItem';政府的成分管制

WPF:获取TreeViewItem';政府的成分管制,wpf,hierarchicaldatatemplate,treeviewitem,Wpf,Hierarchicaldatatemplate,Treeviewitem,如果组成TreeViewItem的组成控件位于hierarichicaldatatemplate中,如何在代码中获取它们 <HierarchicalDataTemplate DataType="{x:Type local:Module}" ItemsSource="{Binding Children}"> <StackPanel Orientation="Horizontal"> <Image Width="16" Height="16" M

如果组成TreeViewItem的组成控件位于hierarichicaldatatemplate中,如何在代码中获取它们

<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的后代

谢谢

Ilya

您可以使用在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;
}
您还可以使用打开的方法手动遍历可视化树

您可以使用在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;
}

您还可以使用打开的方法手动遍历可视化树

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


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


这对我有用。毫无疑问,有一种更好的方法,就像往常一样,你无疑会添加额外的检查,例如检查子(ren)计数和/或获取/检查循环中的子对象的类型/名称等。但是基本技术很有效,虽然我有一个网格而不是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; 
} 

这对我有用。毫无疑问,有一种更好的方法,就像往常一样,你无疑会添加额外的检查,例如检查子(ren)计数和/或获取/检查循环中的子对象的类型/名称等。但是基本技术很有效,虽然我有一个网格而不是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; 
} 

上述解决方案在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>

上述解决方案在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>

这不起作用,因为标头没有ContentTemplate。这不起作用,因为标头没有ContentTemplate。提问者需要找到特定TreeViewItem的命名实例。您的将返回一个新实例化的名称实例,但该实例不正确。提问者需要找到特定TreeViewItem的命名实例。您将返回一个新实例化的名称实例,该实例不正确。