我正在尝试使用 ListView 中的上下文菜单来运行一些代码,这些代码需要来自哪个项目的数据。
我最初只是这样做的:
XAML:
<ListView x:Name="lvResources" ScrollViewer.VerticalScrollBarVisibility="Visible">
<ListView.Resources>
<ContextMenu x:Key="resourceContextMenu">
<MenuItem Header="Get Metadata" Name="cmMetadata" Click="cmMetadata_Click" />
</ContextMenu>
</ListView.Resources>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="ContextMenu" Value="{StaticResource resourceContextMenu}" />
</Style>
</ListView.ItemContainerStyle>
...
C#:
private void cmMetadata_Click(object sender, RoutedEventArgs e)
{
// code that needs item data here
}
但我发现无法通过这种方式访问原始 ListView 项目。
我已经阅读了一些关于如何解决这个问题的策略,比如拦截 MouseDown 事件并为被点击的 listviewitem 设置一个私有(private)字段,但这并不适合我,因为它似乎有点 hacky to pass周围的数据。 WPF 应该很容易,对吧? :) 我读过这个SO question还有这个MSDN forum question ,但我仍然不确定如何真正做到这一点,因为这些文章似乎都不适用于我的情况。有没有更好的方法将点击的项目传递到上下文菜单?
谢谢!
最佳答案
类似于 Charlie 的回答,但不应要求更改 XAML。
private void cmMetadata_Click(object sender, RoutedEventArgs e)
{
MenuItem menu = sender as MenuItem;
ListViewItem lvi = lvResources.ItemContainerGenerator.ContainerFromItem(menu.DataContext) as ListViewItem;
}
关于c# - 确定在执行 ContextMenu MenuItem 时在 ListView 中单击了哪个 ListViewItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1127538/