2012-04-12 15 views
9

Estoy tratando de obtener un menú contextual dentro de ListBox ItemTemplate para llamar a un método en el modelo de vista principal, pasando el elemento que se hizo clic como parámetro. Tengo esto funcionando para otros botones en la plantilla del elemento, pero para el menú contextual parece estar fallando.WPF Menús de contexto en Caliburn Micro

Tengo el siguiente XAML (abreviado para mayor claridad):

<ListBox> 
    <ListBox.GroupStyle> 
     <GroupStyle> 
      ... 
     </GroupStyle> 
    </ListBox.GroupStyle> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ContextMenu> 
        <ContextMenu Name="cm"> 
         <MenuItem Header="Open" 
            cal:Message.Attach="Open($dataContext)"> 

         </MenuItem> 
       </Grid.ContextMenu> 

       <TextBlock VerticalAlignment="Center" > 
        .. text.. 
       </TextBlock> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Tengo la sensación de que esto tiene que ver con el hecho de que el árbol visual es diferente, por lo Caliburn es incapaz de resolver el método fiable. Estoy seguro de que este es un problema común, y he intentado algunas de las cosas que he encontrado en línea, pero parece que nada funciona.

¿Alguna idea?

Respuesta

20

Utilizando la información que encontré en la Caliburn Micro site he modificado su XAML a tener este aspecto:

<Grid Background="White" HorizontalAlignment="Stretch" Height="200" Name="GridLayout">  
    <ListBox x:Name="ListBoxItems">    
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Grid Tag="{Binding DataContext, ElementName=GridLayout}"> 
        <Grid.ContextMenu> 
         <ContextMenu Name="cm" cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"> 
          <MenuItem Header="Open" 
           cal:Message.Attach="Open($dataContext)"> 
          </MenuItem> 
         </ContextMenu> 
        </Grid.ContextMenu> 

        <TextBlock VerticalAlignment="Center" > 
       .. text.. 
        </TextBlock> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

Y mi vista del modelo:

public List<string> ListBoxItems { get; set; } 
    public ShellViewModel() 
    { 
     ListBoxItems = new List<string> {"One", "Two", "Three"};   
    } 

    public void Open(object source) 
    { 
     MessageBox.Show((string) source); 
    } 

abierto fue llamado con éxito con las cuerdas apropiadas de la cuadro de lista.

+0

Voy a intentar esto lo antes posible. – jonnii

+2

Me pregunto por qué esto no fue aceptado. Me ayudó mucho, gracias. –

Cuestiones relacionadas