我是 MVVM 和 WPF TreeView 新手。我做了一些研究并阅读了 Josh Smith 关于 MVVM 的文章,和 this ,和 this .
我认为在 WPF 中创建 TreeView 没有问题。事情是在我的应用程序上,左侧面板是 TreeView ,右侧面板将显示所选 TreeView 节点的一些属性,用户可以单击按钮来编辑属性并将其保存到数据源(并且可能会影响 TreeView 项目)。此外,用户还可以添加/删除子节点/孙节点。
我似乎找不到任何文章/示例来使用 MVVM 实现此功能。
我目前正在考虑在子节点和孙节点的 View 模型中,我应该添加一个指向用户控件的公共(public)属性。右侧面板将绑定(bind)到 TreeView 的所选项目的用户控件。问题是,当用户添加子节点/孙节点时,右侧面板将用于让用户填写信息并保存。不知道会不会影响绑定(bind)。
其他问题,例如编辑树节点的属性,是否意味着将节点的所有子节点信息复制到新节点,并从树中删除旧节点并将新节点添加到树中?
有人可以向我指出有关类似实现的任何好文章,或者对我应该注意的问题等给出一个粗略的想法吗?
非常感谢。 安吉拉
最佳答案
很大程度上取决于您的设置,但这是我之前使用过的一种方法。
请注意,您可能需要一个 ChildPropertyChanged 事件类型(我起了这个名字)来将树中的更改向上冒泡到树的根。
添加节点
我创建了一个 ViewModel,其中包含:
- 树数据集合的属性(可能是对根节点的引用)
- 名为 NewNode 的属性。
- 名为 CurrentNode 的属性
- 将 NewNode 添加到 CurrentNode 的命令:AddCommand
在 View 中:
- 将 TreeView 绑定(bind)到树数据集合
- 将TreeView的SelectedItem绑定(bind)到CurrentNode
- 将控件与新节点的数据绑定(bind)到 NewNode 属性
- 将按钮绑定(bind)到 AddCommand
在 AddCommand 中:
- 将 NewNode 添加到 CurrentNode 并重新初始化 NewNode 属性。
编辑节点
在 View 模型中
- 添加命令:UpdateCommand
- 添加命令:EditCommand
在 View 中
- 将一些编辑控件绑定(bind)到 CurrentNode 的属性(单向绑定(bind))
- 将按钮绑定(bind)到 EditCommand
- 将按钮绑定(bind)到 UpdateCommand
在编辑命令中:
- 使编辑控件和更新按钮可见(我使用 State 属性进行绑定(bind),请参阅下面的额外内容)
在更新命令中:
- 将编辑控件的值写入SelectedNode
- 隐藏编辑控件(我使用 State 属性进行绑定(bind),请参阅下面的额外内容)
删除节点
在 View 模型中
- 添加删除命令
在删除命令中:
- 从集合中删除 CurrentNode
额外
我发现在节点的 ViewModel 上实现 IEditableObject 非常有用。
使用此接口(interface)的方法,您可以添加取消按钮来反转 EditCommand。通过将 State 属性添加到节点的 ViewModel(新建、修改、删除),您可以跟踪更改,了解要发送到模型/数据库的更新,并且可以将 View 绑定(bind)到它以显示/隐藏元素。
关于WPF 以 MVVM 风格添加/编辑/删除 TreeView 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16787546/