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が、私の場合は ではなくListBoxItemListBox. ここからどうやって行くの?リスト内の行のインデックスまたは値が必要なだけです...

編集: ListBox の SelectedIndex ではありません (1 つの選択されたインデックスと、メニューを取得する別のインデックスが存在する可能性があります)。

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 に答える