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

Posted

技术标签:

【中文标题】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 - ListView 为空时不显示上下文菜单的主要内容,如果未能解决你的问题,请参考以下文章

sqlplus“显示参数”结果列如何在glogin.sql为空时不包装

当ListView为空时Android显示文本

我的自定义搜索视图无法正常工作,当搜索输入为空时不显示原始列表

当我的列表为空时,如何显示图像或文本?

WPF ListView在运行时不更新

列表不为空时不调用字段设置器