将ContextMenu的MenuItem可见性绑定到ListView选择

fur*_*ury 7 wpf binding visibility contextmenu menuitem

我有一个带有ListView的用户控件,其中包含来自ObservableCollection的简单项.我希望ListView的ContextMenu包含项目,具体取决于ListView中选择的内容.如果未选择任何项目,则不应显示某些MenuItems.

打开ContextMenu时,甚至都没有调用我的转换器.绑定似乎是错误的,我在输出窗口中找到它:

System.Windows.Data错误:4:找不到引用'ElementName = listView'的绑定源.BindingExpression:路径=的SelectedItem; 的DataItem = NULL; target元素是'MenuItem'(Name =''); 目标属性是"可见性"(类型"可见性")

我不明白什么是错的,无法通过搜索网络来解决这个问题.

这是一些简化的代码:

<UserControl x:Class="MyApp.DatabaseControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:MyApp"
Height="Auto" 
Width="Auto">

<UserControl.Resources>
    <l:ValueToVisibilityConverter x:Key="valueToVisibility" />
</UserControl.Resources>

<Grid>
    <ListView x:Name="listView" ItemsSource="{Binding Persons}">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="140" Header="First Name" DisplayMemberBinding="{Binding FirstName}"/>
                <GridViewColumn Width="140" Header="Last Name" DisplayMemberBinding="{Binding LastName}" />
            </GridView>
        </ListView.View>

        <ListView.ContextMenu>
            <ContextMenu>
                <MenuItem 
                    Header="Open" 
                    Visibility="{Binding SelectedItem, ElementName=listView, Converter={StaticResource valueToVisibility}}"/>
                <Separator/>
                <MenuItem Header="Add..."/>
                <MenuItem Header="Remove"/>
            </ContextMenu>
        </ListView.ContextMenu>
    </ListView>
</Grid>
Run Code Online (Sandbox Code Playgroud)

非常感谢!

And*_*ndy 7

问题是,ContextMenu它不在同一个可视树中ListBox,因此绑定找不到ListBox.如果你绑定PlacementTarget,那应该做的伎俩:

<MenuItem Header="Open"
    Visibility="{Binding RelativeSource={RelativeSource FindAncestor,
        AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem,
        Converter={StaticResource valueToVisibility}}" />
Run Code Online (Sandbox Code Playgroud)