如何通过代码找到 DataTemplate?

How can I find a DataTemplate via code?

知道 HierarchicalDataTemplate 是在资源树的某处定义的(即它可以在应用程序级别、style、window 的资源或某处定义在 window 的控件层次结构中),如何以编程方式确定哪个 HierarchicalDataTemplate 将应用于与特定控件相关的特定数据类型?

例如,在下面的例子中,假设我们有一个 Foo 类型的对象,我们如何才能得到它的 HierarchicalDataTemplate——恰好定义在 window 级别这里--相对于 MainTreeView?

<Window ... >

    <Window.Resources>

        <HierarchicalDataTemplate DataType="{x:Type Foo}"
            ItemsSource="{Binding Children}">
            <TextBlock Text={Binding Name}" />
        </HierarchicalDataTemplate> 

    </Window.Resources>

    <TreeView x:Name="MainTreeView" />

</Window>

我尝试了以下方法,但它 returns 无效:

var hdt = (HierarchicalDataTemplate)MainTreeView.FindResource(typeof(Foo));

找到了。 DataTemplate 对象不像 Style 对象那样使用 DataType 作为它们的默认键。相反,他们使用一个 DataTemplateKey 对象,你得到如下...

var dataTemplateKey = new DataTemplateKey(dataItem.GetType());
var hdt = (HierarchicalDataTemplate)MainTreeView.TryFindResource(dataTemplateKey);

成功了! :)