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

4

我有一个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();
    }                
}

提前致谢!

4个回答

8

使用ContextMenuService.IsEnabled属性来防止上下文菜单的显示。例如:

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

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

1
接受作为答案,这正是我在寻找的! - George Hx

1

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


谢谢你的回答,我知道这可以在代码中完成,但我想要使用绑定在XAML中精确地完成它。 - George Hx

0

感谢您的回答,抱歉我的错,我在这里复制了错误的转换器。我让它返回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也不起作用,我已经没有更多的想法了 :-(


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接