【问题标题】:WPF Get name of ListView item when ContextMenu clickedWPF单击ContextMenu时获取ListView项目的名称
【发布时间】:2020-04-05 08:58:18
【问题描述】:

我有一个填充了项目的列表视图。这些项目中的每一个都附加了一个 ContextMenu。当用户右键单击 ListView 中的这些项目之一并单击 ContextMenu 中的按钮之一时,我需要获取 ListView 中被单击的项目的名称。

我的 ListView XAML 如下所示:

<ListView.Resources>
    <ContextMenu x:Key="ItemContextMenu">
        <MenuItem Click="Download" Header="Download" Command="{Binding Path=DataContext.MoreInfo, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}" Background="WhiteSmoke" />
    </ContextMenu>
</ListView.Resources>

<ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}" >
        <Setter Property="ContextMenu" Value="{StaticResource ItemContextMenu}" />
    </Style>
</ListView.ItemContainerStyle>

当我右键单击名为“Download”的 MenuItem 时,会调用 Download() 函数。

这是 Download() 的代码:

private void Download(object sender, RoutedEventArgs e)
{
    ListViewItem selectedItem = list.SelectedItem as ListViewItem;
    Console.WriteLine("Download clicked!");
    if (selectedItem == null)
    {
        Console.WriteLine("It's nothing!");
    }
}

ListView 中的选定项始终为空。是不是因为当用户右键带来 在上下文菜单中 ListViewItem 在技术上不再被选中?我该如何解决这个问题?

【问题讨论】:

    标签: c# wpf listview user-interface contextmenu


    【解决方案1】:

    您可以使用PlacementTarget 来获取 ContextMenu 的父级。

    PlacementTarget 是一个 DependencyProperty,它允许您引用包含调用的 ContextMenu 的可视树。

    当 ContextMenu 分配给 FrameworkElement.ContextMenu 或 FrameworkContentElement.ContextMenu 属性时,ContextMenuService 会在 ContextMenu 打开时将此属性的此值更改为拥有的 FrameworkElement 或 FrameworkContentElement。 使用不同的 UIElement ,设置 ContextMenuService.PlacementTarget 属性。

    见:MSDN

    private void Download(object sender, RoutedEventArgs e)
    {
        // Note: In this case, the `sender` parameter is the MenuItem as well.
        // MenuItem menuItem = sender as MenuItem
    
        MenuItem menuItem = e.Source as MenuItem;
        ContextMenu menu = menuItem.Parent as ContextMenu;
        ListViewItem item = menu.PlacementTarget as ListViewItem;
    
       if (item != null)
       {
           Console.WriteLine(item.Name);
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-07-04
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      • 2019-03-02
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多