1

我希望能够遍历可视 ui 树以查找 ID 绑定到可视元素的 Tag 属性的元素。

我想知道我是怎么做到的。控件没有要遍历的子项。

我开始使用 LogicalTreeHelper.GetChildren,它似乎按预期工作,直到我点击 TreeView 控件......然后 LogicalTreeHelper.GetChildren 不返回任何孩子。

注意:目的是找到与数据项对应的可视化 UI 元素。也就是说,给定项目的 ID,找到显示它的 UI 元素。

编辑:我显然没有很好地解释这一点。我将一些数据对象绑定到 TreeView 控件,然后希望在给定业务对象 ID 的情况下以编程方式选择特定项目。我不明白为什么遍历可视化树并找到我想要的元素如此困难,因为数据对象的 ID 位于相应可视元素的 Tag 属性中。我正在使用 Mole,并且能够在其标签中找到具有适当 ID 的 UI 元素。我只是在代码中找不到视觉元素。LogicalTreeHelper 不会遍历树中的任何项目。ItemContainerGenerator.ContainerFromItem 也不检索树视图中的项目的任何内容。

4

4 回答 4

1

看看这个样本。我发现这个示例写得很好,我相信使用 view-model 会解决你的问题。

编辑:关于视觉树的搜索。TreeView 和 TreeViewItem 都有 Items 属性,您可以遍历并搜索您的 Id。你不能用吗?

于 2009-04-06T18:07:50.530 回答
0

LogicalTreeHelper.GetChildren 查看控件的 LogicalChildren 属性,对于 TreeView(派生自 ItemsControl 类),该属性默认为 null。您可能必须检查 GetChildren 返回的对象的类型,当您遇到 TreeView 对象时,请执行一些特殊的处理逻辑。

该特殊逻辑可能会遍历树的 Items 并尝试将它们强制转换为 FrameworkElement(定义 Tag 属性的基类)。

于 2009-04-10T15:15:42.380 回答
0

问题是只TreeViewItems创建了可见的 - WPF 不会预先创建所有项目(由于大树可能花费的时间长度,我想)。

更好的方法是创建一个模仿树数据结构的数据结构,并使用数据绑定来告诉TreeView如何显示该数据。如果你愿意,我可以写一个简单的例子。

编辑:根据您的编辑,仅当已为该对象创建 UI 项时才有效,这不能保证。看一下IItemContainerGenerator接口(通过调用ItemsControl.ItemContainerGenerator检索。我相信它有一个方法可以返回TreeViewItem给定数据对象的 UI 容器(即)。这只有在之前创建了 UI 容器时才有效。

于 2009-04-03T22:00:57.687 回答
0

我通过使用 VisualTreeHelper 递归可视化树做了类似的事情。查看Jim Baltzell-Gauthier 撰写的这篇博文——它提供了一些帮助方法来遍历可视化树并按名称和类型返回元素,这类似于我在当前项目中使用的代码。您可以修改这些函数,让它检查标签值,而不是名称。

使用 Visual Tree 需要注意的一件事是,除非已加载视觉对象,否则它不存在 - 如果视觉对象尚未在您调用代码的点。

于 2009-04-10T18:38:44.047 回答