2009-06-20 10 views
7

Tengo un control de usuario con un ListView que contiene elementos simples de un ObservableCollection. Me gustaría que el ContextMenu de ese ListView contenga elementos según lo que esté seleccionado en ListView. Si no se selecciona ningún elemento, algunos ítems del menú no deberían estar visibles.Enlazar la visibilidad de Menu de ContextMenu para la selección de ListView

Mi convertidor ni siquiera se llama cuando abro el ContextMenu. La unión parece estar mal, encuentro esto en la ventana de salida:

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')

No entiendo lo que está mal y no podía averiguarlo mediante la búsqueda en la web.

Aquí hay un código simplificado:

<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> 

Muchas gracias!

Respuesta

7

El problema es que el ContextMenu no está en el mismo árbol visual que el ListBox, por lo tanto, los enlaces no encuentran el ListBox. Si enlaza contra PlacementTarget, que debe hacer el truco:

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

Gracias, esto hizo el truco !! – fury

+0

Si respondió su pregunta, debe marcarla como Aceptada para que ya no aparezca como una pregunta sin respuesta. – Andy

Cuestiones relacionadas