2009-07-08 8 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> 

그리고 현재 제가 현재 사용하고있는 해결책이 있습니다. 당신이 대신 정적 리소스의 DynamicResource 될 당신의 내면의 참조를 변경하면 당신이 원하는대로

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

후 작동됩니다 뒤에 코드

<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> 

. 이는 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가 이미 있습니다 (일반 컬렉션). 감사! –

0

첫 번째 솔루션 대신 DataTemplate을의 HierarchicalDataTemplate을 사용하려고 했습니까? 사례에 대해서는 테스트하지 않았지만 treeviews의 경우에는 일반적으로 그런 식으로 작동합니다.

+0

나는 템플릿에서 TextBoxes가 포함되어 있고 사용자가 TreeViewItems가 아닌 상자 사이를 순차적으로 탭 할 수 있어야하므로 Tab 키를 사용하여 문제가 발생했습니다. TreeViewItem 탭 이벤트를 처리하는 데 너무 많은 시간이 걸렸습니다. –

+0

나는 네비게이션이 정말로 성가시다는 것을 알았다. 어쩌면 그것은 몇몇 특별한 treeview-control 템플릿으로 작동 할 것이지만, 어쨌든 작동하는 해결책이 있습니다. –