visibilidade MenuItem de Bind ContextMenu a seleção ListView
-
06-07-2019 - |
Pergunta
Eu tenho um controle de usuário com um ListView contendo itens simples de uma ObservableCollection. Gostaria que o ContextMenu de que ListView para conter itens dependendo do que está selecionado no ListView. Se nenhum item for selecionado, algumas MenuItems não deve ser visível.
Meu conversor é nem mesmo chamado quando eu abrir a ContextMenu. A ligação parece estar errado, eu acho isso na janela de saída:
System.Windows.Data Erro: 4: Não é possível localizar fonte para a ligação com referência 'ElementName = listView'. BindingExpression: Path = SelectedItem; DataItem = nulo; elemento alvo é 'MenuItem' (Nome = ''); propriedade de destino é 'Visibilidade' (tipo 'Visibilidade')
Eu não entendo o que está errado e não poderia descobrir isso através de pesquisa na web.
Aqui está um 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>
Muito obrigado!
Solução
O problema é que o ContextMenu
não está na mesma árvore visual como o ListBox
, portanto ligações não encontrar o ListBox
. Se você vincular contra PlacementTarget
, que deve fazer o truque:
<MenuItem Header="Open"
Visibility="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem,
Converter={StaticResource valueToVisibility}}" />