2010-03-30 89 views
4

我使用的是.NET 3.0的WPF。在XAML中定義的DataTemplate爲空VisualTree

我有定義爲CellTemplate爲一個GridView一個相對簡單的DataTemplate。我期望DataTemplate的VisualTree屬性包含一個FrameworkElementFactory,但是當我嘗試從GridViewColumnHeader.Click事件訪問它時,該屬性爲null。爲什麼VisualTree是空的?我需要訪問它。這裏是ListView的定義:

<ListView ItemsSource="{Binding Stuff}" GridViewColumnHeader.Click="Header_Click"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Width="28"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <Image Name="statusImage" Width="16" Height="16" Source="../Images/media_play_green_16x16.png"/> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

這裏是事件處理程序:

private void Header_Click(object sender, RoutedEventArgs e) 
{ 
    GridViewColumnHeader gvch = e.OriginalSource as GridViewColumnHeader; 

    // error! VisualTree is null! 
    //gvch.Column.CellTemplate.VisualTree.GetType(); 
} 
+0

你能告訴我們你爲什麼需要訪問該模板的可視化樹?有可能是一個更好的方式來實現你想要做什麼......不過我很好奇,想知道爲什麼它是零,這是相當驚人...... – 2010-03-30 21:07:09

+0

簡短的版本是,我想打電話給VisualTree.SetBinding(FrameworkElement.DataContextProperty ,新的綁定(「Item」)); 的這樣做的目的是使所有數據在單元格模板結合,成爲相對於上在的ItemsSource實際項目的屬性「項」。 – atoumey 2010-03-30 21:10:15

回答

6

這是已知的和預期的行爲。我找不到一個MSDN或其他的「權威」引文的權利,但this MSDN forums post解釋(差不多!):

FrameworkTemplate.VisualTree財產 ...主要用於當你 編程創建 的DataTemplate /的ControlTemplate在代碼, 當 的DataTemplate/ControlTemplate中使用 XAML限定,該屬性將是無效的,因爲 WPF 使用另一機制 實例化和構造XAML 生成的模板(重點 加)

所以當模板從XAML加載未填充的VisualTree屬性:只有當你使用FrameworkElementFactory構造模板代碼,它被填充。

要獲得XAML中定義的模板的內容,調用FrameworkTemplate.LoadContent()。這將實現模板的一個實例,併爲您提供根元素 - 然後您可以根據需要鑽取並設置屬性或綁定。您可以將物化實例插入包含的窗口或控件的可視化樹中,因此您可能想要封裝它!

+0

謝謝。你知道任何文章解釋如何插入加載模板飛入一個ItemsControl?我想在GridViewColumnHeader的CellTemplate上調用LoadContent()並將結果插入到ListView中的單元格中。 – atoumey 2010-03-31 14:02:50

+0

對不起,旅途中,我恐怕不會。我認爲我從一箇舊項目中得到了一個樣本,但是我再也找不到它了,這在任何地方都是完全不同的。我懷疑你需要子類ListView和重寫GetContainerForItemOverride返回ListViewItem的子類,然後將代碼放入ListViewItem的子類 - 但我沒有測試過。 – itowlson 2010-03-31 20:40:12

+0

謝謝。我爲此打開了一個新問題:http://stackoverflow.com/questions/2553964/how-do-i-manually-manage-the-generation-of-cell-visuals-with-a-gridviewcolumn-cel – atoumey 2010-03-31 20:43:22

0

背後視覺樹被空的原因是因爲Visual樹屬性是接近邏輯樹而不是視一眼。 模板的實際內容存儲在它沒有公共成員TemplateContent對象,你將不得不使用LoadContent方法。

相關問題