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

これは私にとってはうまくいきました。いつものように、より良い方法があることは間違いありません。また、子の数をチェックしたり、ループ内の子のタイプ/名前を取得/チェックしたりするなどの追加のチェックを追加することは間違いありませんが、基本的な手法は機能します。 StackPanel の代わりに Grid がありますが、アプリで行いました。

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 に答える