ListBox中的嵌套DataTemplates

时间:2009-07-08 20:06:04

标签: c# wpf listbox datatemplate

有没有办法只从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");
  }

2 个答案:

答案 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作为第一个解决方案? 没有为你的情况测试它,但对于树视图,它通常是这样的。