Вложенные шаблоны данных в ListBox

2

Есть ли способ сделать ссылку 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");
  }
Теги:
wpf
listbox
datatemplate

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

  • 0
    Я даже не тестировал DynamicResource по какой-то сумасшедшей причине, с моей стороны ошибка, но, конечно, она работает. У меня уже был DataTemplateSelector для некоторых элементов в коллекции, который изменяет шаблон в зависимости от типа объекта (это общая коллекция). Спасибо!
0

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

  • 0
    Я сделал, проблема была с табуляцией, так как шаблон содержал TextBoxes, и пользователи должны были иметь возможность последовательно вкладывать вкладки между самими полями, а не TreeViewItems. Это занимало слишком много времени для обработки событий вкладки TreeViewItem.
  • 0
    Я вижу, что навигация действительно будет раздражать. Возможно, он будет работать с каким-то специальным шаблоном управления древовидной структурой, но в любом случае у вас есть рабочее решение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню