0

有类似的问题,但正如我将解释的那样,他们的答案似乎对我不起作用。

我有一个带有 ItemsSource 的 Listbox 为其提供数据...

<ListBox Name="lbPatternResults" SelectionMode="Multiple">
    <ListBox.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Get current values" Click="GetCurrentValuesForID"/>
        </ContextMenu>
    </ListBox.ContextMenu>
</ListBox>

ItemsSource 属性在别处设置为 IEnumerable。

单击菜单项时,发件人是MenuItem,其父项是ContextMenu。通常,要获得ListBoxItem,人们会被告知使用上下文菜单的PlacementTarget,但在我的情况下,它不是ListBoxItem......它是ListBox. 我怎么从这里走?我只想要列表中行的索引或值...

编辑:这不是 ListBox 的 SelectedIndex (可以有一个选定的索引,另一个是您从中获取菜单的索引)。

4

1 回答 1

1

这对我来说很好:

<ListBox>
  <ListBox.Resources>
    <ContextMenu x:Key="MyContextmenu">
      <MenuItem Click="MenuItem_OnClick"
                Header="Test" />
    </ContextMenu>
  </ListBox.Resources>
  <ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
      <Setter Property="ContextMenu"
              Value="{DynamicResource MyContextmenu}" />
    </Style>
  </ListBox.ItemContainerStyle>
  <ListBoxItem Content="A" />
  <ListBoxItem Content="B" />
  <ListBoxItem Content="C" />
  <ListBoxItem Content="D" />
  <ListBoxItem Content="E" />
</ListBox>

和代码隐藏:

private void MenuItem_OnClick(object sender, RoutedEventArgs e) {
  var menuItem = (sender as MenuItem);

  if (menuItem == null)
    return;
  var parentMenu = menuItem.Parent as ContextMenu;

  if (parentMenu == null)
    return;
  var lbItem = parentMenu.PlacementTarget as ListBoxItem;
  if (lbItem != null)
    MessageBox.Show((string)lbItem.Content);
}
于 2013-06-07T14:18:03.267 回答