Binden Sie ContextMenu des MenuItem Sichtbarkeit Listview-Auswahl
-
06-07-2019 - |
Frage
Ich habe eine Benutzersteuerung mit einem Listview mit einfachen Elementen aus einer ObservableCollection. Ich möchte die ContextMenu dieser Listview-Elemente enthalten je nachdem, was in der Listview ausgewählt ist. Wenn kein Element ausgewählt wird, sollten einige MenuItems nicht sichtbar sein.
ist mein Konverter nicht einmal genannt, wenn ich die ContextMenu öffnen. Die Bindung scheint falsch zu sein, ich dies im Ausgabefenster finden:
System.Windows.Data Fehler: 4: Können nicht Quelle für die Bindung mit Bezug finden ‚Elementname = Listview‘. Binding: Path = SelectedItem; DataItem = null; Zielelement ist 'MenuItem' (Name = ''); Zieleigenschaft ist ‚Sichtbarkeit‘ (Typ ‚Sichtbarkeit‘)
Ich verstehe nicht, was falsch ist und kann es nicht durch das Suchen im Internet herausfinden.
Hier ist etwas vereinfacht Code:
<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>
Vielen Dank!
Lösung
Das Problem ist, dass der ContextMenu
ist nicht in der gleichen visuellen Struktur wie die ListBox
daher Bindungen finden nicht die ListBox
. Wenn Sie gegen PlacementTarget
binden, das sollte es tun:
<MenuItem Header="Open"
Visibility="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem,
Converter={StaticResource valueToVisibility}}" />