WPF使用分层数据模板和多种类型的树形视图

3

我有一个树形视图,使用HierarchicalDataTemplate创建,如下面的代码所示:

  <TreeView ItemsSource="{Binding AllFolders}" SelectedItemChanged="TreeView_SelectedItemChanged"/>

并且

            <HierarchicalDataTemplate DataType="{x:Type model:Folder}" ItemsSource="{Binding Tools}">
                <StackPanel Orientation="Horizontal">
                    <Image Source="{StaticResource ResourceKey=icon}"/>
                    <TextBlock Text="{Binding Title}"/>
                </StackPanel>
            </HierarchicalDataTemplate>

            <DataTemplate DataType="{x:Type model:Tool}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}"></TextBlock>
                </StackPanel>
            </DataTemplate>

它的功能很好,但现在我需要将其他类型的对象添加到文件夹中以创建如下树形视图:
- 文件夹1 - 文件夹2 - 工具 - 工具1 - 工具2 - 地点 - 地点1 - 地点2 - 文件夹3
工具和地点必须使用不同的DataTemplate。它们都是包含在Folder类中的IList(IList<Tool>IList<Location>)。
这是否可能实现? 我该如何实现?
谢谢您的帮助。
1个回答

6
如果你想要实现这个功能,可以采取以下两种方法之一:
1)使用类型为ObservableCollection<object>的集合属性,这样你就可以将任何对象类型添加到其中。
2)定义一个接口或基类,让FolderTool类实现(或扩展),然后使用类型为ObservableCollection<YourInterface>ObservableCollection<YourBaseClass>的集合属性,这样你就可以将任何对象类型添加到其中。
然后,根据需要定义尽可能多的DataTemplate,但是不要在它们上设置任何x:Key指令。这样,在遇到来自集合中不同对象时,框架会显式地应用它们。
更新 >>>
重新查看你所需的文件夹结构,似乎只有一种类型作为顶级节点,而ToolLocation对象是Folder对象的子项。如果是这样的话,那么你只需要使用Folder对象的集合作为长达Folder类具有名为FoldersLocations的集合属性即可。
在这种情况下,你只需要为这两种类型以及Folder类提供HierarchicalDataTemplate即可。
更新 2 >>>
你可以定义更多的HierarchicalDataTemplate,一个用于Tool类,另一个用于Location类……只要不提供x:Key指令,它们就会被框架隐式应用。
<HierarchicalDataTemplate DataType="{x:Type model:Tool}" ItemsSource="{Binding Tools}">
    <StackPanel Orientation="Horizontal">
        <Image Source="{StaticResource ResourceKey=icon}"/>
        <TextBlock Text="{Binding Title}"/>
    </StackPanel>
</HierarchicalDataTemplate>

<HierarchicalDataTemplate DataType="{x:Type model:Location}" ItemsSource="{Binding Locations}">
    <StackPanel Orientation="Horizontal">
        <Image Source="{StaticResource ResourceKey=icon}"/>
        <TextBlock Text="{Binding Title}"/>
    </StackPanel>
</HierarchicalDataTemplate>

然而,要实现这一点,您需要按照上述所述更改Folder类中的集合,以便您可以将顶级ToolLocation对象一起添加到其中。如果这些顶级对象只是用于实际项目的“文件夹”,那么您可能可以将它们删除,因为它们会使您的代码变得更加棘手。


1
谢谢,但是如果我没理解错的话,这个解决方案会混合两种类型(工具和位置)。即使我对集合进行排序,我也无法仅展开树视图中的一个类型,对吗? - Desnoxav
你的更新描述得很好,符合我想要做的事情。但主要问题是如何技术上创建分层数据模板。它只能有一个ItemsSource。 - Desnoxav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接