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

标签 c# wpf mvvm contextmenu

背景

我有一个遵循MVVM设计模式的TreeView,并通过在列表中记录TreeViewItem选择来支持多个选择。就目前而言,有几种类型的TreeViewItems可供用户选择。

他们是:

  • 可以包含子Root类型
  • WorldFolderMyDataFodler类型的两个Folder节点
  • 类型为Folder的子LocationFolder, PersonFolder, CollectionFolder节点
  • Item类型的子LocationItem, PersonItem节点
  • CollectionFolder可以包含Folder类型的子节点

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

    问题/问题

    我的顶级 View 模型跟踪TreeViewItems的选择状态,当前选择可能是ItemFolder甚至是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/

    相关文章:

    WPF 和 MVVM : How to Refresh controls

    wpf - 如何在 WPF 中将窗口模式化为页面?

    c# - 在 MVVM 中,在 View 的代码后面访问 ViewModel 是否可以接受?

    android - 如何从 Kotlin 中的外部 Activity 或 fragment 类访问 viewModel 中的对象?

    c# - 如何一次性或手动或本地安装 C# 依赖项以在没有 VS-code 的互联网连接的情况下脱机工作?

    c# - 为什么我可以创建一个名为 "var"的类?

    Wpf TabControl 在所有选项卡上仅创建一个 View

    带有 MVVM 和 Prismv2 的 WPF - 事件冒泡?

    javascript - 在c#中将文本转换为刺绣针迹

    c# - 如何在单独的 AppDomain 中托管 IronPython 引擎?