我有一个与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();
}
}
提前致谢!
答案 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不起作用,我没有想法: - (