我想在一个列表视图中使用上下文菜单来运行一些需要数据的代码,以确定它是从哪个项目启动的。
最初,我只是这样做的:
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
}
但我发现通过这种方式无法访问原始的列表项。
我阅读了一些关于如何解决这个问题的策略,比如拦截MouseDown事件并将私有字段设置为被单击的listviewitem,但是这种方式似乎有点不妥,因为它似乎是一种通过“传递数据”的hack方法。而且WPF应该很容易,对吧? :) 我阅读了这个SO问题和这个MSDN论坛问题,但我仍然不确定如何真正做到这一点,因为这两篇文章似乎都不能在我的情况下工作。是否有更好的方法将被单击的项传递给上下文菜单呢?
谢谢!