WPF:根据条件删除上下文菜单项
Posted
技术标签:
【中文标题】WPF:根据条件删除上下文菜单项【英文标题】:WPF : Remove context menu items based on condition 【发布时间】:2021-12-20 14:56:29 【问题描述】:我在 WPF 中有一个包含以下项目的上下文菜单:
<ContextMenu x:Key="MyContextMenu">
<MenuItem Header="x:Static localization:Resources.MyContext_Command1" Command="Binding Command1" />
<MenuItem Header="x:Static localization:Resources.MyContext_Command2" Command="Binding Command2" />
<Separator />
<MenuItem Header="x:Static localization:Resources.MyContext_Command3" Command="Binding Command3" Visibility="Binding IsItemActive, Converter=converters:BooleanToVisibilityConverter" />
<MenuItem Header="x:Static localization:Resources.MyContext_Command4" Command="Binding Command4" Visibility="Binding IsItemActive, Converter=converters:BooleanToVisibilityConverter" />
<Separator Visibility="Binding IsItemActive, Converter=converters:BooleanToVisibilityConverter"/>
</ContextMenu>
使用上面的代码,这些菜单项(Command3 和 Command4)在 IsItemActive = false 时显示为灰色(禁用),在 IsItemActive = true 时显示为黑色(启用)。但我希望我的菜单项(Command3 和 Command4)以及分隔符从基于“IsItemActive”的上下文菜单中消失/出现。我怎样才能做到这一点?
【问题讨论】:
最简单的方法是将集合绑定到您的 ContextMenu。在您的 ViewModel 中,您可以控制绑定的对象。您从 observable 集合中添加/删除项目,您的 ContextMenu 将按预期显示。这是最简单也是最好的处理方式。 在您看来,您正在尝试基于属于 ItemsControl(GridView 或 ListBox)中某个项目的 IsItemActive 属性来定义 Visibility。在这种情况下,请注意 MenuItem 的 DataContext。可能您需要使用 RelativeSource 或 ElementName 来更改 Visibility 属性中的绑定源。 我们需要查看更多代码。例如,如果您手动将它们设置为Visibility="Collapsed"
会发生什么?
【参考方案1】:
这应该可以解决问题。但是我现在不能让我的绑定工作,所以它没有经过测试。您必须为要应用它的元素命名才能使绑定起作用。就我而言,它是一个窗口。
为IsItemActive
创建一个dependency property 只有这样你才能绑定。
提示:在 Visual Studio 中键入 propdp
并使用双标签来使用代码 sn-p。
<Window x:Class.....
x:Name="mainwindow"
...>
然后在<Window.Resources>
中定义样式
<Style x:Key="MenuItemStyle" TargetType="MenuItem">
<Style.Triggers>
<DataTrigger Binding="Binding ElementName=mainwindow,Path=IsItemActive" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="Binding ElementName=mainwindow,Path=IsItemActive" Value="True">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
复制样式并更改TargetType="Separator"
然后将样式应用于上下文菜单项和分隔符。
<ContextMenu x:Key="MyContextMenu">
<MenuItem Header="x:Static localization:Resources.MyContext_Command1" Command="Binding Command1" />
<MenuItem Header="x:Static localization:Resources.MyContext_Command2" Command="Binding Command2" />
<Separator />
<MenuItem Header="x:Static localization:Resources.MyContext_Command3" Command="Binding Command3" Style="StaticResource MenuItemStyle" />
<MenuItem Header="x:Static localization:Resources.MyContext_Command4" Command="Binding Command4" Style="StaticResource MenuItemStyle" />
<Separator Style="StaticResource SeparatorStyle"/>
</ContextMenu>
【讨论】:
以上是关于WPF:根据条件删除上下文菜单项的主要内容,如果未能解决你的问题,请参考以下文章