无法在样式中为上下文菜单项附加事件处理程序

11

我试图修改XamDataGrid可编辑单元格上XamNumericEditor的默认ContextMenu

以下是我的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>

代码后台文件包含此菜单项的事件处理程序:

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

但是当我启动它时,我捕获到了一个异常并显示以下信息: 无法将类型为'System.Windows.Controls.MenuItem'的对象强制转换为类型为'System.Windows.Controls.ContextMenu'的对象。

你能帮帮我吗?谢谢。


1个回答

13

尝试将 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;
    //...
}

1
哦,谢谢你的第二个解决方案!现在我使用代码后台解决方案,并处理ContextMenuOpening事件 :)。 - Dmitriy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接