WPF 以 MVVM 风格添加/编辑/删除 TreeView 节点

标签 wpf mvvm treeview

我是 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 中:

  1. 将 TreeView 绑定(bind)到树数据集合
  2. 将TreeView的SelectedItem绑定(bind)到CurrentNode
  3. 将控件与新节点的数据绑定(bind)到 NewNode 属性
  4. 将按钮绑定(bind)到 AddCommand

在 AddCommand 中:

  1. 将 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/

相关文章:

c# - 通知集合中某项的属性更改

c# - 从 UI 中选择类型的最佳实践

wpf - 编译时检查绑定(bind)?

linq-to-sql - TreeView,Linq-To-SQL 递归数据填充

c# - WPF TreeViewItem 上下文菜单取消突出显示项目

c# - 在代码中指定 RowDefinition.Height

wpf - Windows 窗体死了。 WPF的长生命周期

c# - TreeNode.BeginEdit() 的问题

wpf - WPF中的圆角扁平按钮

.net - YesNo MessageBox 在单击 x 按钮时未关闭