WPF:空时隐藏ContextMenu

haa*_*gel 11 wpf contextmenu mvvm

我有一个上下文菜单,通过数据绑定获取菜单项(我使用的是MVVM模式):

<ContextMenu ItemsSource="{Binding Path=ContextMenuItems}" />
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,在没有要显示的菜单项的情况下,我不希望上下文菜单显示.有没有办法实现这个目标?某种XAML触发可能吗?

当没有孩子时,我已经尝试捕获Opened事件,关闭上下文菜单.这工作但上下文菜单仍然闪烁...

pba*_*aga 25

您可以定义隐式样式:

<Style TargetType="{x:Type ContextMenu}">
    <Style.Triggers>
        <Trigger Property="HasItems" Value="False">
            <Setter Property="Visibility" Value="Collapsed" />
        </Trigger>
    </Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)

这应该适用于所有上下文菜单.

  • 适合我.非常类似于Adam的答案(也是赞成),但我更喜欢Trigger,而不是BooleanToVisibilityConverter.显然比接受的答案要好 - 我没有经历过Meleak提到的闪烁的上下文菜单. (2认同)
  • 比Converter选项更好。剩下的问题是,当Items(MenuItems)不可见时,属性HasItems也为true。没有HasVisibleItems属性:-/ (2认同)
  • 我试过你的方法,看起来很简单。但如果您有一个动态上下文菜单,如果不需要,其中的项目将被折叠,则它将不起作用。关于如何解决这个问题的任何建议? (2认同)

Tho*_*son 16

也许绑定到菜单项集合计数属性并使用转换器设置上下文菜单的可见性.

 <ContextMenu ItemsSource="{Binding Path=ContextMenuItems}"
              Visibility="{Binding Path=ContextMenuItems.Count,Converter={StaticResource zeroToHiddenConverter}}">
Run Code Online (Sandbox Code Playgroud)
public  class ZeroToHiddenConverter:IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    {
        int count = (int) value;

        if (count == 0) 
        {
            return Visibility.Hidden;
        }
        else
        {
            return Visibility.Visible;
        }
    }
Run Code Online (Sandbox Code Playgroud)