需要生成上下文菜单的ListBoxItem

时间:2013-06-07 13:30:20

标签: c# wpf contextmenu listboxitem

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

我有一个Listbox,其中ItemsSource为其提供数据......

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

ItemsSource属性设置在IEnumerable的其他位置。

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

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

1 个答案:

答案 0 :(得分: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);
}