WPF 单击 ContextMenu 时获取 ListView 项的名称

WPF Get name of ListView item when ContextMenu clicked

我有一个列表视图,其中填充了项目。这些项目中的每一个都附加了一个 ContextMenu。当用户右键单击 ListView 中的这些项目之一并单击 ContextMenu 中的按钮之一时,我需要获取 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() 函数。

这是下载 () 的代码:

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 在技术上不再被选中?我该如何解决这个问题?

您可以利用 PlacementTarget 获取上下文菜单的父级。

PlacementTarget 是一个 DependencyProperty,它允许您引用保存调用的 ContextMenu 的可视化树。

When the ContextMenu is assigned to the FrameworkElement.ContextMenu or FrameworkContentElement.ContextMenu property, the ContextMenuService changes this value of this property to the owning FrameworkElement or FrameworkContentElement when the ContextMenu opens. To use a different UIElement, set the ContextMenuService.PlacementTarget property.

参见: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);
   }
}