2011-03-24 12 views
10

Estoy tratando de modificar ContextMenu predeterminado para XamNumericEditor en XamDataGrid celda editable.No se puede adjuntar controlador de eventos al elemento de menú contextual en el estilo

Aquí es mi XAML-código:

<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> 

código detrás de archivo contiene hadler de eventos para este Menultem:

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

Pero cuando lo comienzo, que captura una excepción con el mensaje: No se puede convertir el objeto de tipo 'System.Windows.Controls.MenuItem' para escribir 'System.Windows.Controls.ContextMenu'.

¿Me puede ayudar con eso? Gracias.

+0

posible duplicado de [Configuración de controladores de eventos dentro de una estructura Setter.Value] (http://stackoverflow.com/questions/4752273/setting-event-handlers-inside-a- setter-value-structure) –

Respuesta

12

Trate de añadir el ContextMenu como recurso y la referencia como un StaticResource no tengo XamDataGrid instalado así que no puedo probarlo, pero debería ser lo largo de las siguientes líneas.

<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> 

Como alternativa, puede utilizar un EventSetter

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

actualización

Para obtener el PlacementTarget debes contar con la ContextMenu. Se podía ir pasándolo como 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

¡Sí! ¡La primera solución funciona perfectamente! Muchas gracias. – Dmitriy

+1

¡Ah, gracias por la segunda solución también! Ahora uso el código detrás de la solución con el manejo del evento ContextMenuOpening :). – Dmitriy

Cuestiones relacionadas