2009-06-20 8 views
7

Mam kontroli użytkownika z ListView zawierające proste elementy z ObservableCollection. Chciałbym ContextMenu tego ListView zawierać elementy w zależności od tego, co jest wybrane w ListView. Jeśli nie wybrano żadnego elementu, niektóre elementy MenuItem nie powinny być widoczne.Bind ContextMenu MenuItem widoczność do wyboru ListView

Mój konwerter nie jest wywoływany nawet po otwarciu ContextMenu. Wiążący wydaje się być złe, znajdę to w oknie wyjściowym:

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

ja nie rozumiem, co się stało i nie mógł zrozumieć to, wyszukując w internecie.

Oto uproszczony kod:

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

dziękuję!

Odpowiedz

7

Problemem jest to, że ContextMenu nie jest w tym samym drzewie wizualnej jako ListBox zatem Wiązania nie znaleźć ListBox. Jeśli zwiążesz z PlacementTarget, to powinno wystarczyć:

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

Dzięki, udało się! – fury

+0

Jeśli to odpowiedziałeś na twoje pytanie, powinieneś oznaczyć je jako Zaakceptowane, aby nie wyświetlało się już jako pytanie bez odpowiedzi. – Andy

Powiązane problemy