为列表视图和列表视图项创建单独的上下文菜单

Posted

技术标签:

【中文标题】为列表视图和列表视图项创建单独的上下文菜单【英文标题】:Create separate context menu for listview and for listview item 【发布时间】:2014-01-31 04:22:49 【问题描述】:

我的 WPF 应用程序中有用于列表视图控件的工作上下文菜单。如果用户右键单击列表视图项但禁用它们是单击发生在列表视图的面板区域上,我希望启用上下文菜单项。 谢谢 MK

更新:这是我的列表视图,但我想在用户单击面板区域时禁用 MenuItems“删除”和“计算”。感谢回复

          <ListView Name="lb_proplist"  DisplayMemberPath ="Name" HorizontalAlignment="Left" ToolTip="Use right click to see more options"  
                  ItemsSource="Binding  Converter=StaticResource FilterByPropTypeConverter" Margin="0,0,0,0" 
                  ContextMenuOpening="ContextMenu_ContextMenuOpening" >


          <ListView.ContextMenu>
            <ContextMenu >
              <MenuItem Name="cmi_addNew" Header="Add New"
                  Command="Binding AddNewItemItem"
                  CommandParameter="Binding RelativeSource=RelativeSource AncestorType=ContextMenu" />
              <MenuItem Name="cmi_remove" Header="Remove"
                  Command="Binding RemoveItem"
                  CommandParameter="Binding RelativeSource=RelativeSource AncestorType=ContextMenu, 
                  Path=PlacementTarget.SelectedItem" />
              <MenuItem Name="cmi_calculate" Header="Calculate"
                  Command="Binding CalculateItem"
                  CommandParameter="Binding RelativeSource=RelativeSource AncestorType=ContextMenu, 
                  Path=PlacementTarget.SelectedItem" />

            </ContextMenu>
          </ListView.ContextMenu>
          <ListView.View>
            <GridView>
              <GridViewColumn Header="Name" DisplayMemberBinding="Binding Name" Width="200"/>
            </GridView>
          </ListView.View>
        </ListView>

【问题讨论】:

您可以发布您尝试过但无法正常工作的代码吗? 【参考方案1】:

这可以使用 ListView 的 ItemsTemplate 属性来完成:

<ListView.ItemTemplate>
    <DataTemplate>
        <DockPanel Tag = "Binding DataContext, ElementName=myListView">

            <TextBlock Text="Binding"/>

            <DockPanel.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Local Item 1" 
                              Command="Binding Path=PlacementTarget.Tag.CommandName, RelativeSource=RelativeSource AncestorType=x:Type ContextMenu"/>
                    <MenuItem Header="Local Item 2"/>
                </ContextMenu>
            </DockPanel.ContextMenu>

        </DockPanel>
    </DataTemplate>
</ListView.ItemTemplate>

例如,ContextMenu 仅为项目创建,而不是为整个控件创建。 此外,Tag 被添加到 DockPanel 中以访问原始 DataContext。


好吧,如果是 GridView,您需要覆盖 ListViewItem 的样式,并将 ContextMenu 绑定为 StaticResource .

                <ListView.Resources>
                    <ContextMenu x:Key="ItemContextMenu">
                        <MenuItem Header="Add New"/>
                    </ContextMenu>
                </ListView.Resources>
                <ListView.ItemContainerStyle>
                    <Style TargetType="x:Type ListViewItem">
                        <Setter Property="ContextMenu" Value="StaticResource ItemContextMenu"/>
                    </Style>
                </ListView.ItemContainerStyle>

请看this article and answer。

【讨论】:

以上是关于为列表视图和列表视图项创建单独的上下文菜单的主要内容,如果未能解决你的问题,请参考以下文章

在 viewpager 中显示列表视图项的上下文菜单

如何获取所选列表视图项中的id以打开上下文菜单并通过下一个活动来实现目标。

检测在列表视图内单击并显示上下文菜单

通过上下文菜单删除后刷新自定义列表视图

根据所选列表视图项的位置设置铃声

Android列表项长按时未显示上下文菜单