Question

J'ai un contrôle utilisateur avec un ListView contenant des éléments simples à partir d'un 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 de menu ne doivent pas être visibles.

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

  

System.Windows.Data Erreur: 4: Impossible de trouver la source pour la liaison avec la référence 'ElementName = listView'. BindingExpression: Path = SelectedItem; DataItem = null; l'élément cible est 'MenuItem' (Name = ''); propriété cible est 'Visibility' (type 'Visibility')

Je ne comprends pas ce qui ne va pas et je ne peux pas le comprendre en cherchant 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!

Était-ce utile?

La solution

Le problème est que le ContextMenu ne se trouve pas dans le même arbre visuel que le ListBox , de sorte que 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}}" />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top