首页 > 解决方案 > 带有 Caliburn.Micro 的 WPF 动态上下文菜单

问题描述

我正在尝试在基于 Caliburn.Micro 的应用程序中创建一个动态上下文菜单。任何人都可以分享一个有效方法的例子吗?到目前为止,我对每个上下文菜单项都有一个非常小的模型:

public class ContextMenuUiModel
{
    public string Name { get; set; }
}

我的视图模型中的一个属性,它显示了这些菜单项模型的列表:

      BindableCollection<ContextMenuUiModel> m_ContextMenuItems = new BindableCollection<ContextMenuUiModel>
  {
     new ContextMenuUiModel { Name="Item 1"},
     new ContextMenuUiModel { Name="Item 2"},
     new ContextMenuUiModel { Name="Item 3"}
  };
  public BindableCollection<ContextMenuUiModel> ContextMenuItems
  {
     get {return m_ContextMenuItems;}
  }

并且,以集合属性命名的菜单项(基于 FreePIE 中的菜单创建,通过此问题和答案找到)

         <TreeView  x:Name="ConfigItemTree" VerticalAlignment="Top" ItemsSource="{Binding ConfigTreeRoot}" >
           <TreeView.ContextMenu>
             <ContextMenu >
                <MenuItem x:Name="ContextMenuItems" DisplayMemberPath="Name" />
             </ContextMenu>
         </TreeView.ContextMenu>

Caliburn.Micro 日志记录报告“get_ContextMenuItems 没有可操作的元素”。此外,尽管 Caliburn 注意到其他未找到属性的命名元素(例如“未应用绑定约定:元素 ConfigItemTree 与属性不匹配。”),但它并未对 ContextMenuItems 做出类似声明。因此,似乎 Caliburn 只是没有将 ContextMenu 视为它可以或应该处理的元素。

也许问题是 Caliburn 看不到上下文菜单,因为它在发生右键单击之前实际上并不存在(类似于折叠元素的问题)?

最终,我希望上下文菜单的内容基于右键单击的树视图项目,可能包括子菜单和/或禁用项目。不过,首先,我会满足于我能得到的任何物品。

标签: wpfdata-bindingcaliburn.micro

解决方案


ItemsSource将 的属性绑定ContextMenuContextMenuItems属性:

<ContextMenu ItemsSource="{Binding PlacementTarget.DataContext.ContextMenuItems, RelativeSource={RelativeSource Self}}" 
             DisplayMemberPath="Name" />

推荐阅读