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" 
...>

然后在&lt;Window.Resources&gt; 中定义样式

<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:根据条件删除上下文菜单项的主要内容,如果未能解决你的问题,请参考以下文章

如何在 wpf 的分层数据模板中显示树视图项的上下文菜单

调用 WPF 选择 TreeView 项作为上下文菜单

WPF TreeViewItem 上下文菜单取消突出显示项

为列表视图和列表视图项创建单独的上下文菜单

WPF的DataGrid中如何通过上下文菜单(右键菜单)实现删除行的操作

如何将上下文菜单添加到 wpf 数据网格?