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

问题描述 投票:1回答:1

我有一个列表视图,其中填充了项目。每个项目都有一个关联的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中选择的项目始终为null。是因为当用户右键单击带来在上下文菜单中,不再从技术上选择ListViewItem?我该如何解决?

c# wpf listview user-interface contextmenu
1个回答
0
投票

您可以利用PlacementTarget获取ContextMenu的MenuItem。

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);
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.