无法将事件处理程序附加到Style中的上下文菜单项

Dmi*_*riy 11 wpf xaml infragistics styles event-handling

我试图修改默认ContextMenuXamNumericEditorXamDataGrid可编辑单元.

这是我的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>
Run Code Online (Sandbox Code Playgroud)

代码隐藏文件包含此MenuItem的事件hadler:

private void MenuItem_Click(object sender, RoutedEventArgs e)
{
//...
}
Run Code Online (Sandbox Code Playgroud)

但是当我启动它时,我捕获一个带有消息的异常: 无法将类型为'System.Windows.Controls.MenuItem'的对象强制转换为'System.Windows.Controls.ContextMenu'.

你能帮帮我吗?谢谢.

Fre*_*lad 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>
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用 EventSetter

<MenuItem Header="Accept for column">
    <MenuItem.Style>
        <Style TargetType="MenuItem">
            <EventSetter Event="Click" Handler="MenuItem_Click"/>
        </Style>
    </MenuItem.Style>
</MenuItem>
Run Code Online (Sandbox Code Playgroud)

更新

为了得到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;
    //...
}
Run Code Online (Sandbox Code Playgroud)