2010-05-16 4 views
4

Je dois créer un ContextMenu dans lequel je veux passer un index sélectionné de la grille de données à un ViewModel en utilisant CommandParameter. Le code Xaml suivant ne fonctionne pas. Quel pourrait être le problème?Comment définir une liaison dans WPF Toolkit Datagrid's ContextMenu CommandParameter

<dg:DataGrid ItemsSource="{Binding MarketsRows}" 
    <dg:DataGrid.ContextMenu > 
     <ContextMenu > 
      <MenuItem Header="Add Divider" 
        CommandParameter="{Binding Path=SelectedIndex, 
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type dg:DataGrid}}}" 
        Command="{Binding Path= AddDividerCommand}"/> 
     </ContextMenu> 
    </dg:DataGrid.ContextMenu> 
</dg:DataGrid> 
+0

Avez-vous vérifié la console de débogage lors du débogage de l'application? Si c'est un problème de liaison, vous pouvez probablement trouver des données pour le dépanner là ... – Anero

+0

Je reçois une erreur de liaison, je ne sais pas comment le résoudre: System.Windows.Data Erreur: 4: Impossible de trouver la source pour la liaison avec la référence 'RelativeSource FindAncestor, AncestorType =' Microsoft.Windows.Controls.DataGrid ', AncestorLevel =' 1 ''. BindingExpression: Path = SelectedIndex; DataItem = null; l'élément cible est 'MenuItem' (Name = ''); La propriété target est 'CommandParameter' (type 'Object') –

Répondre

12

Un menu contextuel ne fait pas partie de la même arborescence visuelle. Les liaisons ancêtres ne fonctionnent pas car le menu contextuel n'est pas un enfant de l'élément sur lequel il se trouve; dans votre cas, le DataGrid.

Il y a quelques solutions de contournement, Ive a répondu à cette question précédemment here et here (kind of)

Mais ce que vous recherchez est la cible de placement à faire quelque chose comme ça (aussi longtemps que AddDividerCommand est une propriété sur la grille de données (la objectif de placement)

<ContextMenu DataContext="{Binding RelativeSource={RelativeSource Mode=Self}, Path=PlacementTarget}"> 
<MenuItem 
    Header="Add Divider" 
    CommandParameter="{Binding Path=SelectedIndex}" 
    Command="{Binding Path=AddDividerCommand}"/> 
</ContextMenu> 
+0

Cela fonctionne !!! Merci! Je n'ai eu qu'à modifier légèrement DataContext: DataContext = "{Liaison RelativeSource = {Mode RelativeSource = Self}, Chemin = PlacementTarget.DataContext}" –

2

Essayez quelque chose comme ça dans votre CommandParameter,

<DataGrid.ContextMenu> 
    <ContextMenu> 
      <MenuItem Header="MyHeader" 
        Command="{Binding MyCommand}" 
        CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.SelectedItem}" /> 
</DataGrid.ContextMenu> 

Je l'ai déjà testé et ça devrait marcher.

Questions connexes