有没有办法只从XAML创建一个DataTemplate引用?在这种特殊情况下,尝试从同一DataTemplate中包含的ListBox引用DataTemplate。这是我想要的解决方案,但不起作用。
<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");
}
答案 0 :(得分:3)
如果您将内部引用更改为DynamicResource而不是StaticResource,那么它将按您的意愿工作。这是因为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
答案 1 :(得分:0)
您是否尝试使用HierarchicalDataTemplate而不是DataTemplate作为第一个解决方案? 没有为你的情况测试它,但对于树视图,它通常是这样的。