c# - 确定在执行 ContextMenu MenuItem 时在 ListView 中单击了哪个 ListViewItem

标签 c# wpf listview contextmenu listviewitem

我正在尝试使用 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/

相关文章:

android - 使用填充重新定位 ListView 的滚动条

c# - 尝试调用 Twitter 流 API 时出现 401 错误

c# - 未找到适合完成此操作的成像组件

wpf - 类型委托(delegate)的 DependencyProperty

android - 可扩展 ListView GroupView 上的复选框在 android 中滚动时自动选中和取消选中

android - 如何根据位置从适配器获取 View 并在android中将选择设置为true?

C#成员变量初始化;最佳实践?

c# - 一些需要手动调用GC.Collect的情况

c# - 无法在数据库更新时保存更改。可能有奇怪的延迟加载行为?

c# - 如何隐藏 XML 配置文件