2012-04-12 17 views
9

Ich versuche, ein Kontextmenü innerhalb einer ListBox ItemTemplate aufzurufen, um eine Methode für das übergeordnete Ansichtsmodell aufzurufen und das Element, auf das geklickt wurde, als Parameter zu übergeben. Ich habe das funktioniert für andere Schaltflächen in der Artikelvorlage, aber für das Kontextmenü scheint es fehlgeschlagen.WPF-Kontextmenüs in Caliburn Micro

Ich habe folgende XAML (der Klarheit halber abgekürzt):

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

Ich habe das Gefühl, dies mit der Tatsache zu tun hat, dass die visuelle Struktur unterschiedlich ist, so Caliburn nicht in der Lage ist, das Verfahren zuverlässig zu lösen. Ich bin mir sicher, dass dies ein häufiges Problem ist, und ich habe einige der Dinge ausprobiert, die ich online gefunden habe, aber nichts scheint zu funktionieren.

Irgendwelche Ideen ??

Antwort

20

die Informationen verwenden ich auf dem Caliburn Micro site fand ich XAML geändert wie folgt aussehen:

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

Und meiner Meinung nach Modell:

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

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

wurde Öffnen Sie mit den entsprechenden Zeichenfolgen aus der erfolgreich aufgerufen Listenfeld.

+0

Ich werde dies so schnell wie möglich versuchen. – jonnii

+2

Ich frage mich, warum das nicht berücksichtigt wurde. Hat mir sehr geholfen, danke. –