2011-03-24 35 views
10

我试图修改默认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> 

隐藏文件中的代码包含该菜单项事件哈德勒:

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

但是,当我开始了,我赶上与消息的异常: 无法将类型为“System.Windows.Controls.MenuItem”的对象转换为键入“System.Windows.Controls.ContextMenu”。

你能帮我吗?谢谢。

+0

[设置事件处理程序Setter.Value结构里面]的可能重复(http://stackoverflow.com/questions/4752273/setting-event-handlers-inside-a-通过这setter-value-structure) – 2011-12-04 22:47:20

回答

12

尝试添加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

是啊!第一个解决方案完美运作十分感谢。 – Dmitriy 2011-03-24 20:46:26

+1

哦,谢谢你的第二个解决方案!现在我使用处理ContextMenuOpening事件的解决方案后面的代码:)。 – Dmitriy 2011-03-24 22:10:02

相关问题