仅当树项的父项是列表中的第一项时,将命令标记为不可用的WPF方法是什么?

Rom*_*kov 2 wpf treeview

我有一个表示某些项目的树视图.这棵树总是两层深.子项的右键单击菜单具有"向上移动"命令.UI允许您向上移动子项,即使它是其父项的第一项,只要在父级别上有另一项,在所选项的父项之上.

显而易见的方法是获取所选项目的父项,并查看其上方是否有项目.但是,在WPF中获取所选项目的父项是微不足道的.同样,显而易见的(对于WPF初学者,无论如何)方法是获取TreeViewItem具有Parent属性的所选项目.不幸的是,这也很难做到.

从那些说这很难的人那里得到暗示,因为我做错了,我决定问那些对WPF更有经验的人:什么是正确的,非硬的方法呢?逻辑上它是微不足道的,但我无法弄清楚处理WPF API的正确方法.

fub*_*aar 5

你用Wpf TreeView做这种事情是非常正确的.其中一个关键部分是Wpf为您提供的灵活性 - 您可以在自定义TreeView中覆盖ItemContainerGenerator,例如,您的树视图可能实际上不包含TreeViewItem对象.即,在类似的Winforms控件中找不到相同的固定层次结构.

一开始看起来真的很反直,MS真的很遗憾MS没有花更多的时间来解释如何让这种事情以不会导致挫折的方式发挥作用.

自从拥抱MVVM以来,我们已经取得了巨大的成功 - 我们总是为绑定到UI的类创建一个ViewModel,毫无例外 - 它更容易在以后的线路中连接新功能.

如果您的树视图绑定了底层视图模型(如果必须,甚至是模型项),并将树视图视为观察者,那么使用Wpf TreeView和其他Wpf控件也会更好.在树形层次结构的实际术语中,您将拥有TreeView可视化的viewmodel对象层次结构 - 其中每个子项都有一个句柄返回其父级,并且每个父级都有一个子视图模型的集合.然后,您将为每个项目提供分层数据模板,其中ItemsSource是ChildCollection.然后,您针对ViewModel启动"MoveUp"命令,并负责进行更改 - 如果您使用基于ObservableCollection的集合(或实现INotifyCollectionChanged),则TreeView会自动更新以反映新的层次结构.

从ViewModel驱动功能,并将UI视为反映ViewModel层次结构和属性的薄层,使代码可以进行高度单元测试 - 代码隐藏中没有代码,您可以经常测试ViewModel功能上没有任何UI,从长远来看,它可以提供更好的代码质量.

当我们开始使用Wpf时,对我们的自然反应是ViewModel有点矫枉过正,但我​​们的经验(在许多地方没有它们开始)是因为他们开始在Wpf中快速获得回报,毫无疑问值得花费额外的努力来获得你的到处走走.

你可能还没有发现的一件事,我们发现它真的很痛苦,就是在树视图上设置所选项目 - 现在这不适合胆小的人:)