gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:51:05 25 4
gpt4 key购买 nike

背景

我有一个遵循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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com