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

时间:2010-07-30 14:35:18

标签: wpf listview binding contextmenu visibility

我有一个与ListView的ContextMenu绑定,但我不想成为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 个答案:

答案 0 :(得分:5)

使用ContextMenuService.IsEnabled属性阻止显示ContextMenu。类似的东西:

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

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

由于绑定现在在ListView本身上,你也可以使用一个自己的RelativeSource而不必使用ElementName,或者你可以通过设置Logins.Count的路径直接绑定到DataContext(假设Logins有自己的Count属性)。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

你的约束力不会起作用。 Visibility属性不是布尔值,它是枚举。您应该使用内置转换器BooleanToVisibilityConverter

答案 3 :(得分: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必须有其他绑定,FindAncestor与AncestorType = ListView不起作用,我没有想法: - (