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怎么控制显示与不显示的主要内容,如果未能解决你的问题,请参考以下文章