【问题标题】:WPF - Do not show Context menu when ListView is emptyWPF - ListView 为空时不显示上下文菜单
【发布时间】: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();
    }                
}

提前致谢!

【问题讨论】:

    标签: wpf listview binding contextmenu visibility


    【解决方案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 效果不佳,我没有想法:-(

      【讨论】:

        猜你喜欢
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多