【问题标题】:Need the ListBoxItem that spawned the Context Menu需要产生上下文菜单的 ListBoxItem
【发布时间】:2013-06-08 01:14:50
【问题描述】:

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

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

【问题讨论】:

  • 您是否尝试将您的ContextMenu 添加到您的DataTemplateListBoxItem 而不是ListBox,然后使用PlacementTarget
  • 我尝试过类似的方法。得到 XAMLParseException 说 ContextMenu 不能有一个视觉或逻辑父。
  • 我添加了一个适合我的小例子。试试看

标签: c# wpf contextmenu listboxitem


【解决方案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);
}

【讨论】:

  • 如果您删除 &lt;ListBoxItem Content="x" /&gt; 并改用 ItemsSource 会怎样?
  • @SamiHuutoniemi 试试吧。测试需要多长时间(它确实有效,我已经尝试过了)
  • 我错过了你的例子的重要部分 :) 只要删除了项目,它就可以工作。谢谢!
  • 虽然这个答案被接受,但我仍然面临一个问题,即 ContextMenu 的 PlacementTarget 是 ListBox 而不是 ListBoxItem。因此,我无法找到哪个 ListBoxItem 创建了 ContextMenu。其他人可以复制这个问题吗?
猜你喜欢
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多