ListView Inside Child TreeViewItem?
大家好,
我有一个具有三个节点的 WPF TreeView,我希望最后一个子节点(第三个节点)包含一个填充了我的绑定数据的 ListView。我遇到的问题是,如果我在 HierarchicalDataTemplate 的 ItemTemplate 中放置一个 ListView,我会为每个孩子获得一个 ListView,而不是一个包含内容的 ListView。这是文档中的预期行为,但我正在寻找解决方法(可能修改 ItemContainerStyle),不幸的是,我几乎没有使用 TreeViewItem 的控件模板的经验,或者一般而言对 TreeViews 有很多经验。
我已经研究过使用 TreeListView 的可能性,但它不适合我的用例,也不适合绑定单独的控件并以这种方式显示数据。
有没有人已经经历过将 ListView 夹在 TreeViewItem 中的麻烦,或者有人可以建议如何修改 ControlTemplate 来实现这一点?
谢谢你,
Aj
事实证明,处理这种情况的最简单方法是将第二个节点上的 HierarchicalDataTemplate 替换为 Expander,在 ListView 而不是 HierarchicalDataTemplate 上设置 ItemsSource,并将 Expander 上的按钮重新设置样式,使其看起来像一个 TreeViewItem.... 有点像 hack 但它可以工作:)
感谢大家的帮助,
Aj
具有 Listview 的节点应该是与其他两个节点不同的数据类型,以便 Treeview 可以不同地处理它。
此外,听起来包含列表视图数据的子元素不应该在 HierarchicalDataTemplate 中,而是在常规的 DataTemplate 中,因为它没有被 Treeview 识别的其他子元素。您可以根据需要在 Treeview 中混合和匹配 HierarchicalDataTemplate 和常规 DataTemplate,常规 DataTemplate 表示"叶"节点,它们没有任何子节点。
在 Treeview 中使用不同数据类型但仍使用分层模板的示例:
1 2 3 4 5 6 7 8 9
| <HierarchicalDataTemplate DataType="{x:Type FooNormal}" ItemsSource="{Binding TreeviewChildNodeCollection}">
// do something else here.
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type FooList}" ItemsSource="{Binding TreeviewChildNodeCollection}">
<ListView ItemsSource="{Binding ListviewChildNodeCollection}">
//use listview here
</ListView>
</HierarchicalDataTemplate> |
- 嘿 BrokenGlass,感谢您的回复...如果您只是按照您提供的代码建议将 ListView 放入 HierarchicalDataTemplate 中,它将为每个叶子节点生成一个 ListView,而不是将叶子填充到单个 ListView 中,即我要做什么。有任何想法吗?
-
您应该在用于 Treeview 数据上下文的数据中使用不同的数据类型。如果您无法区分节点的类型,则无法期待不同的行为。只有您希望在其中包含列表视图的模板才应使用"列表视图"数据类型(在我的示例中为 FooList)。如果使用的数据类型在类层次结构中,模板的顺序也是相关的:首先放置最具体的数据模板,然后是更通用的数据模板。
-
再次感谢您...我知道模板需要正确排序,并且每个模板的数据类型都是相关的。我的 TreeView 的其余部分工作得很好......问题是 TreeView 中的 HierarchicalDataTemplate 或 DataTemplate 将其内容package在 TreeViewItem 中并重新生成与项目源中一样多的项目,所以如果我的叶子节点有十条记录我得到十个空白ListViews,而不是一个有十条记录的ListView。也许我的实现搞砸了,你介意在你让它工作的地方发布 xaml 吗?
-
我实际上找到了一张我想要完成的好照片......显然其他人尝试过,但从未找到解决方案 - i31.tinypic.com/21q44p.png
-
附带说明一下,这是我确定我应该在此之前提到的(拍前额),我的项目源不包含列表视图它只是一个文本集合,我想绑定我的集合到 treeviewitem 中的单个列表视图。也许这将有助于更好地解释我的问题。
-
如果您查看该图片,它会显示每个叶节点的列表视图,具有不同的数据,这可能是创建者想要的。听起来您应该按摩您的数据结构,使其只有一个包含所有数据的叶节点,这将解决您的问题。也可能适用"主详细信息"视图,其中您有一个单独的列表视图,显示当前选定树视图节点的"详细信息"。只是为你抛出选项;-)
-
谢谢,我很感激......我实际上从 MSDN 论坛上的一位版主那里得到了一个建议 - 因为 TreeViewItem 本身就是一个 ItemsControl ,而不是使用 Expander 作为模板化的父级......这就像一个魅力......我只是将扩展器切换按钮修改为看起来像 TreeViewItem 切换,并从父项模板的模板中删除了 TreeViewItem 切换,以消除双缩进的错觉。这有点像 hack,但它有效,所以我会坚持下去。谢谢你的帮助!