我有一个列表视图,其中填充了项目。每个项目都有一个关联的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?我该如何解决?
您可以利用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);
}
}