基于对象集合的动态ContextMenu模式/方法

时间:2010-07-22 17:40:32

标签: c# wpf mvvm contextmenu

背景

我有一个遵循MVVM设计模式的TreeView,它通过在List中记录TreeViewItem选项来支持多种选择。目前,有几种类型的TreeViewItem可供用户选择。

他们是:

  • RootWorldFolder类型的两个MyDataFodler个节点,可以包含子Folder类型
  • 类型Folder
  • 的子LocationFolder, PersonFolder, CollectionFolder个节点
  • Item
  • 类型的子LocationItem, PersonItem个节点
  • CollectionFolder可以包含Folder种类
  • 的子节点

在所有这些中,只需很少的代码就可以很好地工作,并支持Locations和People的集合以及集合中的集合。

问题/疑问

我的顶级视图模型跟踪TreeViewItems的选择状态,当前选择可以是ItemFolder或甚至Root类型节点的组合。根据用户的选择,我想创建一个动态的ContextMenu。到目前为止这个工作!当我选择多个LocationItem和/或PersonItem类型节点时,我的视图模型会生成自定义ContextMenu。问题是复杂性!我的视图模型很快变成了几十个if / else if / else语句来捕获所有可能的排列!

例如:

if (_selectedItems.All(item => item is PersonItem)) // Only people selected
{ 
  // Create ContextMenu based on only PersonItems 
}
else if( _selectedItems.All(item => item is LocationItem)) // Only Locations
{
  // Create ContextMenu based only on LocationItems
}
...

有没有更好的方法来处理用户选择的所有可能排列并更有效地生成我的ContextMenus?

*对于代码格式感到抱歉,整个星期都让我感到悲伤*

1 个答案:

答案 0 :(得分:0)

我不记得我在哪里读到这句明智的话: 使用TreeView的最佳方法不是使用 TreeView

这是什么意思?将功能移动到树节点中,并尽可能保持树形视图。不幸的是,默认情况下,树节点没有很多事件,但很容易将树视图事件重定向到节点。

完成后,您可以覆盖节点中的ContextMenuStrip属性。第一个选定节点创建它想要处理的ToolStripItem列表,并询问允许的树视图(例如,使用FilterMenuItems(desiredItems)方法)。树视图询问所有选定节点他们能够处理哪些节点。结果是您的上下文菜单。

这几乎适用于任何不同节点的数量,并使树(节点)易于维护。

编辑:Dang!错过了WPF标签,所以我无法评估可用的事件,因为我还没有使用WPF