在WPF的TreeView中访问TreeViewItems是错误的吗?

时间:2012-03-23 09:59:25

标签: wpf treeview

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

我曾经多次尝试过访问TreeViewItem,例如我已经接受了not supposed to access a node’s parent via TreeView这个事实(而且我应该自己跟踪父母的情况) )。我一直这样做有两个原因:第一,显然很难找到TreeViewItem,其次,我被告知这很难,因为I’m not supposed to need them如果我做对了。

然而,这次我真的没有办法解决这个问题。

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

我是否因为试图进入TreeViewItem而做错了,或者这是正确的做法?

4 个答案:

答案 0 :(得分:3)

看看约什史密斯的Simplifying the WPF TreeView by Using the ViewModel Pattern文章。希望它有所帮助。

答案 1 :(得分:1)

不可否认,这并不简单,但您可能仍然可以保持分离,而不需要您明知地访问TreeViewItems。 WPF的本质是在你的另一个问题中绑定已经noted by Kent Boogaart,但是你需要以某种方式处理事件。

,您的视图模型需要在视图需要响应时触发自己的BringIntoView事件。

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

答案 2 :(得分:0)

不,我不知道以什么方式访问树视图的项目是错误的。

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

一片叶子有父母,但没有孩子。 节点可以拥有父节点,并且可以拥有子节点。 没有父节点的节点是根节点。

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

答案 3 :(得分:0)

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

另一条证据来自这个高度投票的问题/答案:MVVM madness。 MVVM无疑具有其优势,但有时跟随MVVM的成本如此之高,以至于它只是愚蠢地跟随它,特别是在一个小的单人应用程序中。你真的想要expose IsSelected and IsExpanded the way you’re supposed to吗?

因此,我觉得有理由尝试找出如何以较少的努力从开发人员公开对应于项目的TreeViewItem,假设他们永远不会需要更高级的功能导致TreeViewItem这很难被访问(比如在多个不同的控件中显示相同的ViewModel ...你需要多久那个!...)

我将此工作的结果公布为an answer on another question