2010-07-13 24 views
1

是否有可能通过访问DataTemplate的逻辑树如何获取DataTemplate的逻辑树

<DataTemplate x:Key="Test_DataTemplate"> 
    <Grid >   
     <TextBlock>Test</TextBlock>   
    </Grid>    
</DataTemplate> 

对于上面的例子,如果我通过FindResource("Test_DataTemplate")得到的DataTemplate,是不是就有可能访问树,以获取实例的TextBlock的控制。

请注意,我不想访问使用此DataTemplate的itemscontrol的可视化树。我想访问DataTemplate本身的树。

回答

2

DataTemplate具有VisualTree属性,您可以在应用模板时访问用于创建对象的工厂对象,但无法访问示例中的实际TextBox,因为它在应用模板之前不存在。

更新:

当你在代码中建立的DataTemplate你使用的VisualTree财产它做的的VisualTree属性保存构建可视化树使用模板时所需的数据。

VisualTree属性并未引用模板的实际可视树(由VisualTreeHelper访问),因为该模板没有实际的可视化树 - 只有构建一棵树需要的信息。顺便说一下,为了让事情变得更有趣,数据模板的VisualTree属性的内容更接近于逻辑树而不是可视化树。

稍微测试表明,当您从XAML加载模板时,VisualTree属性为null,并且模板的实际内容存储在别处,此“其他”是TemplateContent对象,并且此对象没有公共成员可用。

因此,为了访问XAML中定义的模板的内容,您必须使用模板的LoadContent方法来实际创建模板中定义的对象,然后使用VisualTreeHelper或LogicalTreeHelper来探索创建的对象。

(你可以使用反射来调查TemplateContent对象 - 但是这意味着你是依靠无证内部实现细节你不完全了解并能版本之间改变 - 所以我不会推荐它)

+0

这对我有意义。但是,在使用DataTemplate之后,VisualTree属性仍然是空的,据我所知。显然,我可以通过VisualTreeHelper访问可视化树,但似乎连接到DataTemplate元素的资源没有附加到VisualTree中的相应元素。我说我应该命名为“访问连接到DataTemplate中元素的资源”。我会进一步调查你给我的信息。它帮助我理解 - 谢谢 – HCL 2010-07-13 14:19:30

+0

@happyclicker - 我测试了它,我的原始答案只适用于在代码中创建的模板,而不是XAML,对此,我已经更新了答案。 – Nir 2010-07-14 06:49:26