2

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

2 回答 2

3

如果您将内部引用更改为 DynamicResource 而不是 StaticResource,那么它将按您的意愿工作。这是因为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

于 2009-07-08T21:27:53.713 回答
0

您是否尝试使用 HierarchicalDataTemplate 而不是 DataTemplate 作为您的第一个解决方案?没有针对您的情况对其进行测试,但是对于树视图,它通常以这种方式工作。

于 2009-07-13T23:03:08.377 回答