Не удается привязать обработчик событий к элементу контекстного меню в стиле

Я пытаюсь изменить значение по умолчанию ContextMenu для XamNumericEditor на XamDataGrid редактируемой ячейке.

Вот мой XAML-код:

<igDP:XamDataGrid.Resources>
  <Style TargetType="{x:Type editors:XamNumericEditor}">
    <Setter Property="ContextMenu">
      <Setter.Value>
        <ContextMenu>
          <ContextMenu.Items>
            <MenuItem Header="Select All"
                      Command="SelectAll">
              <MenuItem.Icon>
                <Image Source="..\icons\table_select_all.png"/>
              </MenuItem.Icon>
            </MenuItem>
            <MenuItem Header="Accept for column"
                      Click="MenuItem_Click">
            </MenuItem>
          </ContextMenu.Items>
        </ContextMenu>
      </Setter.Value>
    </Setter>
  </Style>
</igDP:XamDataGrid.Resources>

Код за файлом содержит событие hadler для этого MenuItem:

private void MenuItem_Click(object sender, RoutedEventArgs e)
{
//...
}

Но когда я его запускаю, я получаю исключение из сообщения: Невозможно наложить объект типа "System.Windows.Controls.MenuItem" на тип "System.Windows.Controls.ContextMenu".

Вы можете мне помочь? Спасибо.

Ответ 1

Попробуйте добавить ContextMenu в качестве ресурса и ссылаться на него как StaticResource У меня нет XamDataGrid, поэтому я не могу попробовать, но он должен быть в следующих строках.

<igDP:XamDataGrid.Resources>
    <ContextMenu x:Key="contextMenu">
        <ContextMenu.Items>
            <MenuItem Header="Select All"
                      Command="SelectAll">
                <MenuItem.Icon>
                    <Image Source="..\icons\table_select_all.png"/>
                </MenuItem.Icon>
            </MenuItem>
            <MenuItem Header="Accept for column"
                      Click="MenuItem_Click"></MenuItem>
        </ContextMenu.Items>
    </ContextMenu>
    <Style TargetType="{x:Type editors:XamNumericEditor}">
        <Setter Property="ContextMenu" Value="{StaticResource contextMenu}"/>
    </Style>
</igDP:XamDataGrid.Resources>

В качестве альтернативы вы можете использовать EventSetter

<MenuItem Header="Accept for column">
    <MenuItem.Style>
        <Style TargetType="MenuItem">
            <EventSetter Event="Click" Handler="MenuItem_Click"/>
        </Style>
    </MenuItem.Style>
</MenuItem>

Обновление

Чтобы получить PlacementTarget, вам понадобится ContextMenu. Вы можете передать это как CommandParameter

<MenuItem Header="Accept for column"
          CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"
          Click="MenuItem_Click">
</MenuItem>

private void MenuItem_Click(object sender, RoutedEventArgs e)
{
    MenuItem menuItem = sender as MenuItem;
    ContextMenu contextMenu = menuItem.CommandParameter as ContextMenu;
    var placementTarget = contextMenu.PlacementTarget;
    //...
}