wpf - 将 ContextMenu 的 MenuItem 可见性绑定(bind)到 ListView 选择

标签 wpf binding contextmenu visibility menuitem

我有一个带有 ListView 的用户控件,其中包含来自 ObservableCollection 的简单项目。我希望该 ListView 的 ContextMenu 包含取决于在 ListView 中选择的项目。如果未选择任何项目,则某些 MenuItems 不应可见。

当我打开 ContextMenu 时,甚至没有调用我的转换器。绑定(bind)似乎是错误的,我在输出窗口中找到了这个:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=listView'. BindingExpression:Path=SelectedItem; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'Visibility' (type 'Visibility')



我不明白出了什么问题,也无法通过搜索网络来弄清楚。

这是一些简化的代码:
<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>

非常感谢!

最佳答案

问题是 ContextMenuListBox 不在同一可视树中,因此绑定(bind)找不到 ListBox .如果你绑定(bind)到 PlacementTarget , 这应该够了吧:

<MenuItem Header="Open"
    Visibility="{Binding RelativeSource={RelativeSource FindAncestor,
        AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem,
        Converter={StaticResource valueToVisibility}}" />

关于wpf - 将 ContextMenu 的 MenuItem 可见性绑定(bind)到 ListView 选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1021825/

相关文章:

wpf - 无法更改 XAML Accordion 中的蓝色背景

c# - WPF 用户控件的绑定(bind)问题

.net - WPF 控件的 Binding.Mode=Default 的默认值是什么?

c# - Visual Studio 2010 : Add new class file that inherits from existing class?

ios - 在上下文菜单 SwiftUI 中显示不同的 View

c# - 如何在后台代码中创建 ListBoxItem

c# - WebBrowser 滚动到 tr

c# - 无法在 DropDownButton 中组织数据

wpf - DataGrid - 使用 MVVM 绑定(bind)到列表列表

mfc - "Sticky"MFC弹出菜单