2011-01-20 10 views
7

Tengo un ListView y me gustaría configurar un menú contextual que puedo abrir no solo al hacer clic con el botón derecho en alguna columna pero en cualquier parte del ListViewItem, para hacer así que pensé que simplemente había configurado mi ContextMenu usando un setter de estilo ya que no puedo acceder directamente al ListViewItem.Configuración de controladores de eventos dentro de una estructura Setter.Value

Desafortunadamente cuando intenta hacerlo de esta manera que no se compilará:

<Style TargetType="ListViewItem"> 
    <Setter Property="ContextMenu"> 
     <Setter.Value> 
      <ContextMenu> 
       <MenuItem Header="Header" Click="Handler"/> 
       ... 
      </ContextMenu> 
     </Setter.Value> 
    </Setter> 
</Style> 

Error 102 'Handler' no es válido. 'Click' no es un evento en 'System.Windows.Controls.GridView'.

que pensé que se puede evitar mediante el uso de un EventSetter para la Click -Evento. Pero es evidente que el código se infló bastante de todas las etiquetas de embalaje que necesita.

Mi pregunta es si hay alguna solución para que no tenga que tratar con EventSetters.


Editar: Ver this question una explicación sobre por qué se produce este error.

Respuesta

10

usted puede poner el ContextMenu en el ListView 'Recursos s y luego usarlo como un recurso estático, de esa manera usted no tendrá que utilizar un estilo para el MenuItem' s

<ListView ...> 
    <ListView.Resources> 
     <ContextMenu x:Key="listViewContextMenu"> 
      <MenuItem Header="Header" Click="MenuItem_Click"/> 
     </ContextMenu> 
    </ListView.Resources> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="ListViewItem"> 
      <Setter Property="ContextMenu" Value="{StaticResource listViewContextMenu}"/> 
     </Style> 
    </ListView.ItemContainerStyle> 
    <!--...--> 
</ListView> 
+0

¡Buena idea! Gracias. –

0

Usted puede simplemente ListBoxItem.HorizontalContentAlignment a Stretch y luego poner ContextMenu en su ListBox.ItemTemplate. He aquí un ejemplo:

<Grid> 
    <Grid.Resources> 
     <PointCollection x:Key="sampleData"> 
      <Point X="10" Y="20"/> 
      <Point X="30" Y="40"/> 
     </PointCollection> 
    </Grid.Resources> 
    <ListBox Width="100" ItemsSource="{StaticResource sampleData}"> 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="ListBoxItem"> 
       <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
      </Style> 
     </ListBox.ItemContainerStyle> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Grid Background="Red"> 
        <Grid.ContextMenu> 
         <ContextMenu> 
          <MenuItem Header="Test" Click="MenuItem_Click"/> 
         </ContextMenu> 
        </Grid.ContextMenu> 
        <TextBlock Text="{Binding}"/> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 
+0

Me temo que no funcionará porque estoy usando un GridView ... –

+0

Lo siento, la pregunta dice ListBox y pasé por alto los otros indicios de que en realidad es un ListView. –

+0

Oh wow, tienes razón, escribió TotalBox allí tres veces, solo que no lo estropeó en el código ya que está copiado, lo siento. –

Cuestiones relacionadas