Вложенные шаблоны данных в ListBox - PullRequest
2 голосов
/ 09 июля 2009

Есть ли способ сделать ссылку на DataTemplate непосредственно из XAML? В этом конкретном случае пытаются ссылаться на 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 ]

3 голосов
/ 09 июля 2009

Если вы измените свою внутреннюю ссылку на 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

0 голосов
/ 14 июля 2009

Вы пытались использовать HierarchicalDataTemplate вместо DataTemplate для своего первого решения? Не проверял это для вашего случая, но для древовидных представлений это обычно работает таким образом.

...