背景
我有一个遵循MVVM设计模式的TreeView,并通过在列表中记录TreeViewItem选择来支持多个选择。就目前而言,有几种类型的TreeViewItems可供用户选择。
他们是:
Root
类型WorldFolder
和MyDataFodler
类型的两个Folder
节点Folder
的子LocationFolder, PersonFolder, CollectionFolder
节点Item
类型的子LocationItem, PersonItem
节点CollectionFolder
可以包含Folder
类型的子节点在所有这些中,只需很少的代码就可以很好地工作,并且支持Locations和People的集合以及Collections中的集合。
问题/问题
我的顶级 View 模型跟踪TreeViewItems的选择状态,当前选择可能是
Item
,Folder
甚至是Root
类型节点的组合。根据用户的选择,我想创建一个动态的ContextMenu。到目前为止,这有效!当我选择几个LocationItem
和/或PersonItem
类型节点时,我的 View 模型会生成一个自定义ContextMenu。问题是复杂性!我的 View 模型正在迅速变为数十个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?
*对不起代码格式,整个星期都让我感到悲伤*
最佳答案
我不记得我在哪里读到这句话:
使用TreeView的最佳方法是不要不使用TreeView
这是什么意思?将功能移到树节点中,并使树 View 尽可能保持拇指。不幸的是,默认情况下,树节点没有很多事件,但是很容易将树 View 事件重定向到节点。
完成后,您可以在节点中覆盖ContextMenuStrip属性。选择的第一个节点将创建要处理的ToolStripItems列表,并询问允许的树状 View (例如,使用FilterMenuItems(desiredItems)方法)。树 View 询问所有选定的节点它们将能够处理哪些节点。结果是您的上下文菜单。
这几乎可以处理任何数量的不同节点,并使树(节点)易于维护。
编辑:当!错过了WPF标记,因为我尚未使用WPF,所以我无法评估可用事件
关于c# - 基于对象集合的动态ContextMenu的模式/方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3311699/