WPF:根据条件删除上下文菜单项
WPF : Remove context menu items based on condition
我在 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”的上下文菜单中消失/出现。我怎样才能做到这一点?
这应该可以解决问题。但是我现在无法让我的绑定工作,所以它没有经过测试。您必须为要应用此元素的元素命名才能使绑定生效。就我而言,它是 window.
为IsItemActive
创建一个dependency property才可以绑定。
提示:在 Visual Studio 中键入 propdp
和双制表符以使用代码段。
<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 中有一个上下文菜单,其中包含以下项目:
<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”的上下文菜单中消失/出现。我怎样才能做到这一点?
这应该可以解决问题。但是我现在无法让我的绑定工作,所以它没有经过测试。您必须为要应用此元素的元素命名才能使绑定生效。就我而言,它是 window.
为IsItemActive
创建一个dependency property才可以绑定。
提示:在 Visual Studio 中键入 propdp
和双制表符以使用代码段。
<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>