使用具有嵌套列表的列表填充WPF树视图

时间:2018-03-25 11:18:32

标签: c# wpf xaml treeview

我在我的应用程序中得到了以下设置;

5种数据类型;

  • 系统
  • 设备
  • 设备
  • 信号

现在,Area总是最高级别,但可以包含所有其他四种类型的孩子 - 所以我添加了一个区域列表,并且在每个区域下面都会有一个其他类型的嵌套列表。

系统将始终是区域的子级,但可以包含最后三种类型的子级 - 依此类推。

See my nested layout here

现在我想用这个嵌套布局填充树视图。我已经使用其他类型的嵌套列表创建了一个区域列表 - 但是如何获得树视图以显示此层次结构?

1 个答案:

答案 0 :(得分:0)

您正在寻找HierarchicalDataTemplateDataTemplate。 因为您的TreeView应该支持多个不同的模板,所以应该放置它们是TreeView的资源。

<TreeView ItemsSource="{Binding Path=CollectionWithRootElement}">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type blabla:Area}" ItemsSource="{Binding Path=SubItemsCollectionOfThisType}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="Area Type" />
            </StackPanel>
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type blabla:System}" ItemsSource="{Binding Path=SubItemsCollectionOfThisType}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="System Type" />
            </StackPanel>
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type blabla:Signal}" >
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="Signal Type" />
            </StackPanel>
        </DataTemplate>
    </TreeView.Resources>
</TreeView>

有几点需要注意:

  • TreeView需要一个Collection来绑定,如果只有一个Area,则可能需要创建一个只有一个Area元素的集合。
  • HierarchicalDataTemplate有子节点,DataTemplate则没有。因此,具有嵌套集合的任何类都由HierarchicalDataTemplate表示。没有更多子元素的'Leaf'元素由DataTemplate表示。
  • 上面的XAML使用虚拟命名空间blabla。你必须调整它以满足你的需要,例如<Window xmlns:blabla="clr-namespace:MyApp.Namespace"></Window>