【问题标题】:Is it wrong to access TreeViewItems in WPF’s TreeView?在 WPF 的 TreeView 中访问 TreeViewItems 会不会出错?
【发布时间】:2012-04-07 21:26:10
【问题描述】:

我在 WPF 中遇到了 TreeView 的问题。此控件使very hard 可以访问它所显示的TreeViewItems。

在某些情况下,我已经解决了访问TreeViewItem 的需要,例如,我接受了我是not supposed to access a node’s parent via TreeView 的事实(并且应该自己跟踪父母)。我一直这样做有两个原因:首先,显然很难到达TreeViewItems,其次,我被告知这很难,因为如果我做对了I’m not supposed to need them

但是,这一次我真的没有办法解决这个问题。

基本上,我想要的只是,给定我的视图模型实例之一,将树视图滚动到它。 This is trivial 如果我能得到相应的TreeViewItem

我尝试访问TreeViewItem 是不是又做错了,还是那是正确的方法?

【问题讨论】:

  • Here 是 Josh Smith 的一篇文章,它可以准确地处理您想要的 - 将树视图项目滚动到视图中。 Josh 的解决方案使用附加行为。

标签: wpf treeview


【解决方案1】:

查看 Josh Smith 的 Simplifying the WPF TreeView by Using the ViewModel Pattern 文章。希望对你有帮助。

【讨论】:

  • 这篇文章很好但是没有解释如何使用 SelectedItem 或 IsSelected 属性。
【解决方案2】:

诚然,这并不简单,但您可能仍然可以这样做,同时保持不需要您有意访问TreeViewItems 的分隔。 WPF 的本质在你的另一个问题中已经绑定了noted by Kent Boogaart,但是在这里你需要以某种方式处理事件。当视图需要做出反应时,您的视图模型需要触发自己的 BringIntoView 事件。

最简单的方法可能是在Loaded 上添加EventSetter 以使TreeViewItems 在他们的DataContext 上订阅所述事件,这应该是您的视图模型(如果不是,您可以等待DataContextChanged)。

【讨论】:

  • 听起来可能是我需要的。谢谢。
  • 很难接受这样一个事实,即 WPF 方法是在每个视图模型中手动重新公开 TreeViewItem 已经公开的所有内容。不过我明白了。
  • @romkyns:你会习惯的,映射也不一定是 1:1,因为理论上你可以有不同的视图,例如如果您在一个简单的 ListBox 中表示一个节点的子节点,则该事件将是相同的,但它会影响另一个控件。重新展示您需要的内容可为您提供更大的灵活性,并将状态与当前视图解耦。
【解决方案3】:

不,我看不出以何种方式访问​​树视图的项目是错误的。

我认为您遇到的困难是因为您没有看到应有的树视图。

叶子有父母,但没有孩子。 一个节点可以有父节点,也可以有子节点。 没有父节点的节点是根。

基于这些原则 (SourceMaking Composite pattern),您应该能够使用递归做任何您想做的事情。 (在 XAML 和代码中)

【讨论】:

  • 我遇到的困难不在于对树的理解;它在 API 中。困难在于如何,给定我绑定的集合中的一个项目,我可以得到对应的TreeViewItem
【解决方案4】:

我得出的结论是,这不可能是完全错误的。第一条证据来自 Bea Stollnitz’s post about ListView:如果 WPF 开发人员解释了如何做到这一点,那不会错。

另一个证据来自这个投票率很高的问题/答案:MVVM madness。 MVVM 无疑有它的好处,但有时遵循 MVVM 的成本如此之高,以至于它只是愚蠢地遵循它,尤其是在一个小型单人应用程序中。你真的要expose IsSelected and IsExpanded the way you’re supposed to吗?

因此,我觉得有理由尝试找出如何以较少开发人员的工作量来公开与项目相对应的TreeViewItem,假设他们永远不需要导致@987654328 的更高级的功能@s 很难访问(例如在多个不同的控件中显示相同的 ViewModel...您需要多久那个!...)

我将这项工作的结果发布为an answer on another question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2012-07-12
    • 1970-01-01
    • 2012-12-08
    • 2011-09-29
    • 2016-10-11
    • 1970-01-01
    相关资源
    最近更新 更多