2009-07-08 62 views
2

是否有任何方法可以從XAML自己創建一個DataTemplate引用?在這種特殊情況下,試圖從包含在同一DataTemplate中的ListBox引用DataTemplate。這是我想要的解決方案,這是行不通的。ListBox中的嵌套DataTemplates

<DataTemplate x:Key="nestedItem" DataType="{x:Type local:NestedItem}"> 
    <Expander Header="{Binding Path=Name}"> 
     <ListBox ItemsSource="{Binding Path=Items}" x:Name="itemsList" 
     ItemTemplate="{StaticResource nestedItem}"/> 
    </Expander> 
    </DataTemplate> 

而且這裏是我目前使用的解決方案,它的工作原理。

<DataTemplate x:Key="nestedItem" DataType="{x:Type local:NestedItem}"> 
    <Expander Header="{Binding Path=Name}" Expanded="OnItemExpanded"> 
     <ListBox ItemsSource="{Binding Path=Items}" x:Name="itemsList"/> 
    </Expander> 
    </DataTemplate> 

隨着後面的代碼:

private void OnItemExpanded(object sender, RoutedEventArgs e) 
    { 
    if (e.OriginalSource != sender) return; 
    var source = (Expander) sender; 
    ListBox listBox = source.FindName("itemsList") as ListBox; 
    NestedItem item = source.DataContext as NestedItem; 
    listBox.ItemsSource = item.Items; 
    listBox.ItemTemplate = (DataTemplate) FindResource("nestedItem"); 
    } 

回答

3

如果你改變你內心的參考是一個DynamicResource,而不是一個靜態資源,然後它會工作,只要你想。這是因爲there are some differences StaticResource和DynamicResource實際查找Resource項目的方式。

<DataTemplate x:Key="Local_NestedItem" 
       DataType="{x:Type local:NestedItem}"> 
    <Expander Header="{Binding Path=Name}"> 
     <ListBox ItemsSource="{Binding Path=Items}" 
      x:Name="itemsList" 
      ItemTemplate="{DynamicResource Local_NestedItem}" /> 
    </Expander> 
</DataTemplate> 

另外,如果你不介意使用一些代碼,另一個很好的選擇是使用一個DataTemplateSelector

+0

我甚至沒有測試過DynamicResource出於一些瘋狂的原因,我的錯誤,但肯定它的工作原理。對於集合中的某些項目,我已經有了一個DataTemplateSelector,它根據對象類型(它是一個通用集合)來更改模板。謝謝! – 2009-07-08 22:12:17

0

你嘗試使用HierarchicalDataTemplate代替的DataTemplate你的第一個解決方案? 沒有爲你的情況進行測試,但對於treeviews它通常以這種方式工作。

+0

我做過了,問題出現在TabBbing中,因爲模板包含TextBoxes,用戶需要能夠在Box自身之間按順序選擇Tab,而不是TreeViewItems。處理TreeViewItem選項卡事件花費了太多時間。 – 2009-07-14 13:45:15