需要生成上下文菜单的ListBoxItem

本文关键字:菜单 ListBoxItem 上下文 | 更新日期: 2023-09-27 18:17:19

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

我有一个Listbox与ItemsSource提供它的数据…

<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(可以有一个选定的索引,另一个您从中获得菜单)。

需要生成上下文菜单的ListBoxItem

这对我来说很好:

<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);
}