WPF中ContextMenu怎么控制显示与不显示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF中ContextMenu怎么控制显示与不显示相关的知识,希望对你有一定的参考价值。

参考技术A 首先想到的是使用DataGridComboBoxColumn来实现,可是在绑定数据的时候出现了问题,数据怎么也绑定不上。
后来经过多方查证,发现原来DataGridComboBoxColumn对数据源有限制,只能是一下3中情况之一: 1、静态资源。 2、x:静态代码实体。 3、Comb

WPF - ListView 为空时不显示上下文菜单

【中文标题】WPF - ListView 为空时不显示上下文菜单【英文标题】:WPF - Do not show Context menu when ListView is empty 【发布时间】:2011-03-23 07:08:01 【问题描述】:

我有一个 ContextMenu 绑定到 ListView,但我不想成为 ListView 为空时显示的菜单。我尝试直接绑定到元素,尝试使用 FindAncestor 进行绑定,但这些都不起作用,并且当我在 ListView 中单击鼠标右键时始终显示菜单。 正确的绑定是什么?

<Grid>
<ListView x:Name="loginListView" ItemsSource="Binding Logins">
    <ListView.View>
        <GridView>
            <GridViewColumn Width="140" Header="Login" DisplayMemberBinding="Binding Login"/>
            <GridViewColumn Width="140" Header="Password" DisplayMemberBinding="Binding Password" />
        </GridView>
    </ListView.View>

    <ListView.ContextMenu>
        <ContextMenu>
            <MenuItem 
                Header="Delete login" 
                Visibility="Binding ElementName=loginListView, Path=Items.Count, Converter=StaticResource VisibilityConverter"/>
        </ContextMenu>
    </ListView.ContextMenu>
</ListView>

public class visibilityConverter: IValueConverter

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        if ((int)value > 0)
        
            return true;
        
        else
        
            return false;
        
    
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        throw new NotImplementedException();
                    

提前致谢!

【问题讨论】:

【参考方案1】:

使用ContextMenuService.IsEnabled 属性防止显示上下文菜单。类似的东西:

<ListView x:Name="loginListView" ItemsSource="Binding Logins"
    ContextMenuService.IsEnabled="Binding ElementName=loginListView,
        Path=Items.Count, Converter=StaticResource VisibilityConverter">

使用返回 True 或 False 的转换器。

由于绑定现在在 ListView 本身上,您还可以使用具有 Self 的 RelativeSource 的绑定,而不必使用 ElementName,或者您可以通过将路径设置为 Logins.Count 直接绑定到 DataContext(假设登录有自己的 Count 属性)。

【讨论】:

作为答案被接受,这就是我要找的!【参考方案2】:

最简单的方法是监听 ListView 的 ContextMenuOpening 事件。然后,您可以执行任何您想要的逻辑并取消打开菜单。

【讨论】:

感谢您的回答,我知道它可以在代码中完成,但我想使用 Binding 在 XAML 中完全完成。【参考方案3】:

您的绑定不起作用。 Visibility 属性不是布尔值,而是枚举。你应该使用内置转换器BooleanToVisibilityConverter

【讨论】:

【参考方案4】:

感谢您的回答,对不起,我从剪贴板复制了错误的转换器。 我让它返回返回 Visibility.Visible 或 Visibility.Hidden,但它并没有解决我的问题。

奇怪的是当我这样做时:

<ListView.ContextMenu>
   <ContextMenu>
      <MenuItem Header="Binding ElementName=loginListView, Path=Items.Count"/>
   </ContextMenu>
</ListView.ContextMenu>

我得到一个带有空字符串的 ContextMenu,无论 ListView 是否有项目! 但是当我这样做时以相同的形式:

<Button Content="Binding ElementName=loginListView, Path=Items.Count" Name="deleteButton" Width="100" Height="30" HorizontalContentAlignment="Center" />

我看到按钮内容根据 ListView 项目计数正确更改!似乎 ListView 必须有其他绑定,带有 AncestorType=ListView 的 FindAncestor 效果不佳,我没有想法:-(

【讨论】:

以上是关于WPF中ContextMenu怎么控制显示与不显示的主要内容,如果未能解决你的问题,请参考以下文章

仅当右键单击鼠标悬停在特定的 datagridrow WPF C# 上时才显示 ContextMenu

浏览器控制台工具的控制显示与不显示问题

在显示 contextMenu 时做一些事情

WPF - ListView 为空时不显示上下文菜单

WPF-MenuItem只显示最后一个Icon

WPF 托盘图标右键弹出的ContextMenu如何关闭