Иерархическая таблица данных WPF и ItemsControl
-
10-07-2019 - |
Вопрос
У меня есть список, содержащий объекты, которые следуют этой структуре.Это не те реальные классы, с которыми я работаю, но они должны объяснить концепцию.
классы
public class BaseType{}
public class TypeA : BaseType{}
public class TypeB: BaseType
{
public List<TypeA> TypeAList { get; private set; }
}
Список , к которому привязывается ItemsControl , является List<BaseType>
XAML
<ItemsControl>
<ItemsControl.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:TypeB}" ItemsSource = "{Binding Path=TypeAList}">
<DataTemplate.Resources>
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="18"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</DataTemplate.Resources>
<Grid>
<Ellipse Fill="Gold"/>
<StackPanel>
<TextBlock Margin="3,3,3,0"
Text="{Binding Path=Description}"/>
<TextBlock Margin="3,0,3,7"
Text="{Binding Path=Name}"/>
</StackPanel>
</Grid>
</HierarchicalDataTemplate>
<ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel></StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Теперь то, что я ожидал бы увидеть, - это все объекты TypeA, найденные в свойстве объекта TypeB, которые будут отображаться в ItemsControl , вместо этого я вижу только объекты TypeB, отображаемые со стилями, определенными для HierarchicalDataTemplate .я использовал ту же datatemplate в элементе управления TreeView, где он нормально отображает дочерние элементы.
- Вы не можете использовать HierarchicalDataTemplate в ItemsControl?
- Как вы собираетесь отображать отношения родитель-потомок в ItemsControl?
Решение
Вам действительно нужно изучить создание шаблонов и работу с элементом управления TreeView или создать свой собственный элемент управления для работы с иерархическими данными.
В некоторых ситуациях вы можете создать свой собственный шаблон данных для обычного элемента управления items, вложенные элементы управления которого привязаны к элементу, например (псевдоним)
<HierarchicalDataTemplate>
<Grid DataContext="{Binding}">
<ListBox ItemsSource="{Binding TypeAList}" />
</Grid>
</HierarchicalDataTemplate>
Еще не пробовали приведенный выше код
Элемент управления должен знать об HierarchicalDataTemplate - и в приведенном выше примере элемент управления просто использует его как DataTemplate (HierarchicalDataTemplate является производным от DataTemplate для простоты стилей и типа DependencyProperty для этого шаблона данных).