【问题标题】:Can't attach event handler to Context Menu Item in Style无法将事件处理程序附加到样式中的上下文菜单项
【发布时间】:2011-07-22 10:43:59
【问题描述】:

我正在尝试在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>

文件后面的代码包含此 MenuItem 的事件处理程序:

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

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

你能帮我吗?谢谢。

【问题讨论】:

标签: wpf xaml event-handling styles infragistics


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

【讨论】:

  • 哦,也感谢第二个解决方案!现在我使用解决方案背后的代码来处理 ContextMenuOpening 事件:)。
猜你喜欢
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多