【问题标题】:navigate all items in a wpf tree view在 wpf 树视图中导航所有项目
【发布时间】:2014-10-29 01:24:27
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: wpf treeview tree


    【解决方案1】:

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

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

    【讨论】:

    • items 属性是不可视的数据项。然后我可以获取数据项并要求相应的可视项,然后我需要遍历可视项的 Items 属性,即数据项。这行不通,我只想走可视化树……好蹩脚
    【解决方案2】:

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

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

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

    【讨论】:

    • 根据我对 TreeView 的工作,这就是它的工作原理。树节点前面没有可视化树。这些是根据需要按需创建的。因此,不可能可靠地导航“可视化树”。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      使用视觉树需要注意的一点是,除非视觉对象已加载,否则它不存在 - 如果视觉对象尚未加载,您可能需要将委托附加到视觉元素的“已加载”事件在您调用代码时呈现。

      【讨论】:

      • 死链接{不重要,只是为了获得正确的评论长度}。
      • 好的,更新了——感谢提醒,看来博主更改了他的博客引擎。
      猜你喜欢
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 2010-11-30
      相关资源
      最近更新 更多