2010-07-13 49 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