代码之家  ›  专栏  ›  技术社区  ›  Matthew

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

  •  1
  • Matthew  · 技术社区  · 16 年前

    背景

    他们是:

    • 两个 Root 类型的节点 WorldFolder MyDataFodler 其中可以包含子对象 Folder 类型
    • 孩子 文件夹 类型的节点 LocationFolder, PersonFolder, CollectionFolder
    • 孩子 Item 类型的节点 LocationItem, PersonItem
    • CollectionFolder 文件夹 类型

    在所有这些情况下,只需很少的代码就可以很好地工作,并支持位置和人员的集合,以及集合中的集合。

    问题

    我的顶层视图模型跟踪TreeViewItems的选择状态,当前选择可能是 项目 , 文件夹 甚至 LocationItem PersonItem

    例如:

    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
    }
    ...
    

    有没有更好的方法来处理所有可能的用户选择排列,并更有效地生成我的上下文菜单?

    *很抱歉代码格式化,这一周我都很难过*

    1 回复  |  直到 14 年前
        1
  •  0
  •   Tim Cooper    14 年前

    我不记得在哪里读到过这样一句话: 使用TreeView的最好方法不是使用 树视图

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

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

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