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!

Foi útil?

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}}" />
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top