【问题标题】:Bind ContextMenu's MenuItem visibility to ListView selection将 ContextMenu 的 MenuItem 可见性绑定到 ListView 选择
【发布时间】:2010-11-04 13:01:55
【问题描述】:

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

当我打开 ContextMenu 时,甚至没有调用我的转换器。绑定好像有问题,我在输出窗口找到这个:

System.Windows.Data 错误:4:找不到与引用“ElementName=listView”进行绑定的源。绑定表达式:路径=选定项;数据项=空;目标元素是'MenuItem'(名称='');目标属性是“可见性”(类型“可见性”)

我不明白哪里出了问题,也无法通过网络搜索。

下面是一些简化的代码:

<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>

非常感谢!

【问题讨论】:

    标签: wpf binding contextmenu visibility menuitem


    【解决方案1】:

    问题是ContextMenuListBox 不在同一个可视化树中,因此绑定找不到ListBox。如果你绑定PlacementTarget,那应该可以解决问题:

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

    【讨论】:

    • 如果这回答了您的问题,您应该将其标记为已接受,以便它不再显示为未回答的问题。
    猜你喜欢
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2011-06-22
    • 2020-04-22
    • 2017-05-11
    • 2010-12-06
    相关资源
    最近更新 更多