2009-06-20 6 views
7

J'ai un contrôle utilisateur avec une ListView contenant des éléments simples d'une ObservableCollection. Je voudrais que le ContextMenu de ce ListView contienne des éléments en fonction de ce qui est sélectionné dans le ListView. Si aucun élément n'est sélectionné, certains éléments MenuItems ne doivent pas être visibles.Bind ContextMenu MenuItem Visibilité de la sélection ListView

Mon convertisseur n'est même pas appelé lorsque j'ouvre le ContextMenu. La liaison semble être mal, je trouve cela dans la fenêtre de sortie:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=listView'. BindingExpression:Path=SelectedItem; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'Visibility' (type 'Visibility')

Je ne comprends pas ce qui ne va pas et ne pouvait pas le comprendre en effectuant une recherche sur le web.

Voici un code simplifié:

<UserControl x:Class="MyApp.DatabaseControl" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:l="clr-namespace:MyApp" 
Height="Auto" 
Width="Auto"> 

<UserControl.Resources> 
    <l:ValueToVisibilityConverter x:Key="valueToVisibility" /> 
</UserControl.Resources> 

<Grid> 
    <ListView x:Name="listView" ItemsSource="{Binding Persons}"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Width="140" Header="First Name" DisplayMemberBinding="{Binding FirstName}"/> 
       <GridViewColumn Width="140" Header="Last Name" DisplayMemberBinding="{Binding LastName}" /> 
      </GridView> 
     </ListView.View> 

     <ListView.ContextMenu> 
      <ContextMenu> 
       <MenuItem 
        Header="Open" 
        Visibility="{Binding SelectedItem, ElementName=listView, Converter={StaticResource valueToVisibility}}"/> 
       <Separator/> 
       <MenuItem Header="Add..."/> 
       <MenuItem Header="Remove"/> 
      </ContextMenu> 
     </ListView.ContextMenu> 
    </ListView> 
</Grid> 

Merci beaucoup!

Répondre

7

Le problème est que le ContextMenu n'est pas dans le même arbre visuel que le ListBox, par conséquent les liaisons ne trouvent pas le ListBox. Si vous liez contre PlacementTarget, cela devrait faire l'affaire:

<MenuItem Header="Open" 
    Visibility="{Binding RelativeSource={RelativeSource FindAncestor, 
     AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem, 
     Converter={StaticResource valueToVisibility}}" /> 
+0

Merci, cela a fait l'affaire !! – fury

+0

Si cela répond à votre question, vous devez la marquer comme Acceptée afin qu'elle n'apparaisse plus comme une question sans réponse. – Andy

Questions connexes