Привязать видимость MenuItem ContextMenu к выбору ListView - PullRequest
7 голосов
/ 20 июня 2009

У меня есть пользовательский элемент управления с ListView, содержащий простые элементы из ObservableCollection. Я хотел бы, чтобы ContextMenu этого ListView содержал элементы в зависимости от того, что выбрано в ListView. Если элемент не выбран, некоторые элементы меню не должны отображаться.

Мой конвертер даже не вызывается, когда я открываю ContextMenu. Привязка кажется неправильной, я нахожу это в окне вывода:

System.Windows.Data Ошибка: 4: не удается найти источник для привязки со ссылкой «ElementName = listView». BindingExpression: Path = SelectedItem; DataItem = NULL; Целевым элементом является «MenuItem» (Name = ''); Целевым свойством является «Видимость» (тип «Видимость»)

Я не понимаю, в чём дело, и не смог разобраться с помощью поиска в Интернете.

Вот упрощенный код:

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

Большое спасибо!

1 Ответ

7 голосов
/ 20 июня 2009

Проблема в том, что ContextMenu не находится в том же визуальном дереве, что и ListBox, поэтому привязки не находят ListBox. Если вы связываетесь с PlacementTarget, это должно сработать:

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