wpf - 带有 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 看不到上下文菜单,因为它在发生右键单击之前实际上并不存在(类似于折叠元素的问题)?
最终,我希望上下文菜单的内容基于右键单击的树视图项目,可能包括子菜单和/或禁用项目。不过,首先,我会满足于我能得到的任何物品。
解决方案
ItemsSource
将 的属性绑定ContextMenu
到ContextMenuItems
属性:
<ContextMenu ItemsSource="{Binding PlacementTarget.DataContext.ContextMenuItems, RelativeSource={RelativeSource Self}}"
DisplayMemberPath="Name" />
推荐阅读
- javascript - Vuex在组件中获取变异后的状态
- mongodb - 如何用空格分割字符串并从mongodb中的字符串中删除数字?
- javascript - 未捕获的安全错误:无法在 'HTMLCanvasElement' [JS] [jQuery] 上执行 'toDataURL'
- python - 代码中是否有错误的实现或只是 Python 中的错误?
- javascript - 问号 (?) 在 webpack 的条目中是什么意思?
- python - 虽然多边形绘图点/线中的点失败(Circle.contains_point;Python;matplotlib;pyplot)
- ssl - 找不到预期的 Java 密钥库 (JKS) 文件!当使用 Kafka Bitnami helm chart 启用通过 TLS 加密时,它们是强制性的
- django - 如何使用 Django 在 Elastic Transcoder 中设置作业输出的持续时间?
- java - 从 2.5B 记录中取出 2.14B 记录后,Resultset.next() 没有继续前进,并且在很长一段时间后就存在了
- vue.js - 如何使 Vue 组件的类绑定绑定到内部元素而不是根元素?