我的问题如下:我得到了一个具有动态深度类别的树(每个类别都可以有子类别和条目)。
现在我添加了一个HierarchicalDataTemplate,用于在TreeView中正确显示的类别。但是我得到了很多空条目,它们不应用模板(错误的类型),但在树中显示为“尸体”。
如何禁止它们进入生成过程?因为它是一个抽象树,所以它们与类别具有相同的基类。所以他们进入树,因为树总是搜索“分支” - 属性,其中包含类别,条目或两者。
有什么想法吗?我没有发现TreeView的任何事件,这可能让我有机会在生成期间跳过各种条目,也没有模板的任何选项/属性这样做。
详细说明:我有一个通用的Tree类。该类具有“A_TreeLeaf”类型的分支(抽象)。 Tree的泛型类型当然必须继承A_TreeLeaf。我的数据按类别(CategoryTreeLeaf)和Data(DataTreeLeaf)构建。当然,每片叶子都可以有子叶(分枝)。
现在我从数据库加载数据并构建树。每个类别都有X个子类别。每个类别也可能包含一些数据。这个结构对我有很大的帮助,因为我有一个清晰的分类结构的类别和数据。这种方式应该向用户显示。但我想分开数据和类别。 TreeView应该只显示类别(通过HierarchicalDataTemplate),ListView只显示数据(通过DataTemplate)。 ListView工作正常,但树显示一些“尸体” - 条目是DataTreeLeaf实例。
我想在生成时过滤DataTreeLeafs或者只是停止显示它们的TreeView。有没有“非黑客”的解决方案?除非真的有必要,否则我不想复制树并删除数据叶...因为这会导致很多开销工作要为我做,并管理后面使用真实树或可视化的代码使用假树(因为我需要以某种方式将其桥接,以便在其中一个更改时自动更新)。
答案 0 :(得分:1)
您有一个独特的问题...您在分层数据中有一些您不想显示的数据项,但由于某种原因无法删除。如果这总结了你的问题,那么你做错了。
在WPF中,您不需要从UI中隐藏数据项,而是首先不将它们放入集合中。听起来你填充分层数据的过程是有缺陷的,你最好在源头修复它,而不是试图处理它在UI中引起的问题。
如果由于某种原因无法修复实际过程,那么您的下一个最佳选择是在显示之前迭代数据并简单地删除不应存在的任何数据元素。使用WPF时,最好为UI提供符合目的的数据。
但是,如果由于某种原因你甚至无法做到这一点,那么你的最后一个选择就是为你的抽象基类定义一个额外的DataTemplate
并将其留空:
<DataTemplate DataType="{x:Type YourDataTypesPrefix:YourBaseClass}">
</DataTemplate>
当然,您必须为每个子类型定义DataTemplate
,否则它们也会被渲染为空。