gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:42:24 25 4
gpt4 key购买 nike

我有一个代表某些项目的 TreeView 。这棵树总是两层深。子项的右键单击菜单有一个“上移”命令。 UI 允许您将子项向上移动,即使它是其父项的第一个项,只要在父级有另一个项,在所选项的父项之上。

执行此操作的明显方法是获取所选项目的父级并查看其上方是否有项目。但是,在 WPF 中获取所选项目的父项绝非易事。同样,显而易见的(对于 WPF 初学者而言)方法是获取所选项目的 TreeViewItem,它具有 Parent 属性。不幸的是,这也很难做到。

从说 it’s hard because I’m doing it wrong 的人那里得到暗示,我决定问那些对 WPF 更有经验的人:什么是正确的、不困难的方法来做到这一点?从逻辑上讲,这很简单,但我想不出处理 WPF API 的正确方法。

最佳答案

您完全正确,使用 Wpf TreeView 做这种事情很痛苦。其原因的一个关键部分是 Wpf 为您提供的灵 active - 例如,您可以在自定义 TreeView 中覆盖 ItemContainerGenerator,并且您的 TreeView 可能实际上不包含 TreeViewItem 对象。即,您在可比较的 Winforms 控件中找不到相同的固定层次结构。

一开始看起来真的很反直觉,MS 没有花更多时间解释如何让这种事情以不会导致挫败感的方式工作,这真是一种耻辱。

自从采用 MVVM 以来,我们在 Wpf 方面取得了巨大的成功 - 以至于我们总是为绑定(bind)到 UI 的类创建一个 ViewModel,无一异常(exception) - 只是更容易连接新的稍后的功能。

如果您有 TreeView 绑定(bind)的基础 View 模型(如果必须的话,甚至是模型项),并且将 TreeView 视为观察者,您将与 Wpf TreeView 和其他 Wpf 控件相处得更好也。实际上,对于树绑定(bind)层次结构,您将拥有一个 View 模型对象的层次结构,您的 TreeView 正在可视化 - 其中每个子对象都有一个返回其父对象的句柄,并且每个父对象都有一个 subview 模型集合。然后,您将拥有每个项目的分层数据模板,其中 ItemsSource 是 ChildCollection。然后,您针对 ViewModel 启动“MoveUp”命令,它会负责进行更改 - 如果您使用的是基于 ObservableCollection(或实现 INotifyCollectionChanged)的集合,那么 TreeView 会自动更新以反射(reflect)新的层次结构。

从 ViewModel 驱动功能,并将 UI 视为反射(reflect) ViewModel 层次结构和属性的薄层,使得代码可以进行高度单元测试 - 代码隐藏中没有代码,您通常可以在完全没有任何 UI 的情况下测试您的 ViewModel 功能,从长远来看,这会产生质量更高的代码。

当我们开始使用 Wpf 时,我们的自然 react 是 ViewModels 太过分了,但我们的经验(在很多地方没有使用它们开始)是它们在 Wpf 中开始很快得到返回并且毫无疑问值得付出额外的努力让你的头脑。

您可能还没有遇到的一件事,我们发现这真的很痛苦,那就是在 TreeView 上设置所选项目 - 现在这不是胆小者的事:)

关于wpf - 仅当树项的父项是列表中的第一个时,WPF 将命令标记为不可用的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9761336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com