2009-09-03 17 views
0

Tout d'abord jeter un oeil à mon code:Obtenez VisualTemplate sous-jacente ItemTemplate d'un ItemsControl dans le gestionnaire d'événements ContextMenu.MenuItem.Click?

<ListBox ItemsSource="{Binding}" SelectionMode="Multiple" 
    ItemTemplate="{StaticResource ContactTemplate}"> 
    <ListBox.ContextMenu> 
     <ContextMenu> 
      <MenuItem Name="mnuEdit" Header="_Edit" Click="MenuItem_Click" /> 
     </ContextMenu> 
    </ListBox.ContextMenu> 
</ListBox> 

Je veux, le lorsque l'utilisateur droit clique sur un ListBoxItem individuel dans la zone de liste, il doit être transmis (ou l'indice de celui-ci ou tout un moyen de trouver l'élément que l'ContextMenu a sauté-sur.

Répondre

1

vous devez définir ItemContainerStyle ou ItemsTemplate pour la zone de liste et d'ajouter ContextMenu là. maintenant, vous allez à l'intérieur du SelectedValue (DataContext)

vous pouvez définir ContextMenu pour votre 'ContactTemplate', de sorte que lorsque vous faites un clic droit sur votre ContextMenu aura le Dat un sur lequel vous avez cliqué (à partir de MenuItem.DataContext)

Une autre manière, qui suppose que votre rightclick peut avoir déjà défini ce ListBoxItem en tant que Sélectionné. Dans l'événement Cliquez sur Menu vous pouvez obtenir le SelectedIndex par ((FrameworkElement) expéditeur) .DataContext

<MenuItem DataContext="{Binding ElementName=lstBox,Path=SelectedIndex}" ..../> 
1

Essayez ceci:

private void MenuItem_Click(object sender, RoutedEventArgs e) { 

    var listItem = (((FrameworkElement)sender)).DataContext; //Cast however you want