2010-07-20 5 views
2

Pour mon application WPF, j'utilise MVVM, et maintenant je veux afficher un menu contextuel généré lorsque l'utilisateur clique avec le bouton droit de la souris sur quelque chose.
Routing le clic-droit à une action était facile, mais comment puis-je montrer un menu contextuel quels éléments sont générés par le ViewModel?WPF MVVM: comment créer et afficher un menu contextuel?

Je n'ai même pas d'idée d'où commencer à afficher un menu contextuel, puisque je n'ai pas directement accès à la vue dans MVVM.

Répondre

3

Toutes mes excuses pour le retard de lui répondre, devait avoir un peu d'une expérience pour le faire fonctionner. Donnez le code suivant un aller. Je viens de créer ma propre source de données pour que je puisse afficher certaines données. Il ne s'affiche que si je fais un clic droit sur le titre de la première colonne et nulle part ailleurs ... ce que je pense est ce que vous voulez, non? Faites-moi savoir comment vous allez ... tous les problèmes continueront à avoir une réflexion.

<Grid> 
    <ListView Margin="8,8,33,12" ItemsSource="{Binding Source={StaticResource Stuff}, Path=MyCollection}"> 
     <ListView.View> 
     <GridView> 
       <GridViewColumn Width="100" DisplayMemberBinding="{Binding}"> 
        <GridViewColumnHeader>ProductName 
         <GridViewColumnHeader.ContextMenu> 
          <ContextMenu Name="MyMenu"> 
           <MenuItem Header="Sort by..."/> 
           <MenuItem Header="Follow link..."/> 
          </ContextMenu> 
         </GridViewColumnHeader.ContextMenu> 
        </GridViewColumnHeader> 
       </GridViewColumn> 
       <GridViewColumn Width="100" Header="Product Name" DisplayMemberBinding="{Binding Path=Length}"/> 
     </GridView> 
     </ListView.View> 
    </ListView> 
</Grid> 
3

Si, par exemple, que vous vouliez montrer un ContextMenu sur une DataGrid que vous pourriez peut-être montré les ventes faire:

  <y:DataGrid.ContextMenu> 
      <ContextMenu> 
       <MenuItem Name="cmNewSales" Foreground="Black" Command={Binding Path=MyCommand}/> 


      </ContextMenu> 
     </y:DataGrid.ContextMenu> 

où MyCommand est une propriété Command exposée par ViewModel ou crée une ObservableCollection de commandes dans ViewModel, qui sont exposées et liées dans la propriété ItemSource du ContextMenu.

espoir qui aide

+0

Dans mon cas, je veux que le ContextMenu à joindre aux éléments d'en-tête d'un GridView dans un ListView - toute idée où mettre le ContextMenu dans ce cas (je ne veux pas être partout le ContextMenu dans la ListView, juste l'en-tête)? – Sam

+0

Salut Sam, juste répondu comme une nouvelle 'réponse' afin que le code formaterait bien. Voir ci-dessous. – jameschinnock

+0

Je pense que c'est la meilleure réponse car cela déplace la responsabilité de l'affichage du menu dans la vue tout en gardant l'exécution de la logique pour les éléments de menu dans la machine virtuelle. Cela signifie également que les éléments du menu peuvent être réarrangés, supprimés, modifiés, etc. sans que la machine virtuelle soit impliquée puisque la présentation est entièrement dans le code XAML. – nrjohnstone