我在网上寻找解决方案,但在我的样本中找不到。我需要添加一个上下文菜单项之间的分隔符是从后面的代码生成.我试图添加它与这样的代码行如下,但没有成功。
this.Commands.Add(new ToolStripSeparator());
我想知道是否有人可以帮助。先谢谢你。
上下文菜单XAML:
<Style x:Key="DataGridCellStyle" TargetType="{x:Type DataGridCell}">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu ItemsSource="{Binding Commands}">
<ContextMenu.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Command" Value="{Binding}" />
<Setter Property="Header" Value="{Binding Path=Text}" />
<Setter Property="CommandParameter" Value="{Binding Path=Parameter}" />
</Style>
</ContextMenu.ItemContainerStyle>
</ContextMenu>
</Setter.Value>
</Setter>
在方法中添加的C#:
this.Commands = new ObservableCollection<ICommand>();
this.Commands.Add(MainWindow.AddRole1);
this.Commands.Add(MainWindow.AddRole2);
this.Commands.Add(MainWindow.AddRole3);
this.Commands.Add(MainWindow.AddRole4);
//this.Add(new ToolStripSeparator());
this.Commands.Add(MainWindow.AddRole5);
this.Commands.Add(MainWindow.AddRole6);
this.Commands.Add(MainWindow.AddRole7);
6条答案
按热度按时间hc2pp10m1#
我曾经这样做过一次,并使用
null
作为分隔符。然后,我从XAML中对模板进行样式化,以便在datacontext为null时使用分隔符代码隐藏:
XAML是这样的:
希望我得到了正确的语法-我没有在这台机器上的IDE来验证代码
编辑
下面是上下文菜单分隔符的示例模板。我把它放在
ContextMenu.Resources
中,尽管你可以把它放在你的应用程序中的任何地方,只要ContextMenu可以访问它。iezvtpos2#
编辑:
我对这个问题的第一个答案,虽然它实际上是有效的,但并不遵循MVVM设计原则。我现在提供一种MVVM方法,并将原始答案留在下面以供参考。
你可以创建一个行为来解决这个问题。
XAML:
视图模型:
行为:
分类:
原始答案:
或者,将ContextMenu绑定到FrameworkElements的集合,而不是将其绑定到命令的集合,然后您可以将MenuItems或Separators直接添加到集合,并让Menu控件完成所有模板化....
C#:
在我的应用程序中使用了这种方法-分隔符看起来也更好。
prdp8dxp3#
我已经修改了上面Rachel提供的解决方案,以纠正Separator样式。我知道这篇文章很老了,但仍然是谷歌上最好的结果之一。在我的情况下,我是用它作为一个菜单与上下文菜单,但同样的工作。
XAML
Without Separator Style Change
With Separator Style Change
sbtkgmzw4#
使用ItemTemplateSelector:
Xaml:
型号:
h5qlskok5#
WPF提供了你正在寻找的东西--它被称为“分隔符”:
wsxa1bj16#
为了正确地为MVVM执行此操作,您必须定义自己的项目界面(例如 IMenuItem),为***Menu***/***ContextMenu***和***MenuItem***创建派生类,在这些类中重写以下虚拟保护方法:
确保此方法为 IMenuItem 类型的项目创建新派生自***MenuItem***类型的容器,并绑定所有需要的属性,在这里您可以区分不同类型的 IMenuItem 以显示普通项目,分隔符或其他一些东西。对于未知类型,调用基实现。
现在,如果您将新派生自***Menu***/***ContextMenu***控件的 ItemsSource 属性与 IMenuItem 的集合绑定,它将显示您预期的结果,而无需现在ViewModel端的View-stuff。