2012-04-12 21 views
9

Sto cercando di ottenere un menu di scelta rapida all'interno di un oggetto ListBox per chiamare un metodo sul modello di visualizzazione padre, passando l'elemento su cui è stato fatto clic come parametro. Ho questo lavoro per altri pulsanti nel modello di elemento, ma per il menu di scelta rapida sembra non riuscire.Menu di scelta rapida WPF in Caliburn Micro

Ho il seguente XAML (abbreviato per chiarezza):

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

Ho la sensazione che questo ha a che fare con il fatto che la struttura ad albero visuale è diverso, quindi Caliburn è in grado di risolvere il metodo affidabile. Sono sicuro che questo è un problema comune e ho provato alcune delle cose che ho trovato online, ma niente sembra funzionare.

Qualche idea ??

risposta

20

Utilizzando le informazioni che ho trovato sul Caliburn Micro site ho modificato il tuo XAML per assomigliare a questo:

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

E la mia vista del modello:

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

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

Aperto è stato chiamato con successo con le stringhe appropriate dalla casella di riepilogo.

+0

Darò questo una prova al più presto. – jonnii

+2

Mi chiedo perché questo non è stato accolto. Mi ha aiutato molto, grazie. –