Как отключить контекстное меню ListView, когда ничего не выбрано? - PullRequest
0 голосов
/ 03 марта 2012

У меня ListView в WPF установлен на GridView, и у него есть контекстное меню. Как включить контекстное меню, только когда что-то выбрано в ListView?

Я хочу сделать все это в XAML, чтобы следовать шаблону MVVM, поэтому любая помощь будет хорошей.

1 Ответ

1 голос
/ 03 марта 2012

Вы должны использовать триггеры. Сначала определите ContextMenu как ресурс. Вот краткий пример:

<Window x:Class="SO.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <ContextMenu x:Key="ctxmnu">
            <MenuItem Header="Open" />
            <MenuItem Header="Close" />
        </ContextMenu>
    </Window.Resources>

    <StackPanel>
        <ListView x:Name="lv">
            <ListView.Items>
                <clr:String>Item 1</clr:String>
                <clr:String>Item 2</clr:String>
            </ListView.Items>
            <ListView.View>
                <GridView>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
            <ListView.Style>
                <Style TargetType="ListView">
                    <Setter Property="ContextMenu" Value="{StaticResource ctxmnu1}" />
                    <Style.Triggers>
                        <Trigger Property="SelectedIndex" Value="-1">
                            <Setter Property="ContextMenu" Value="{x:Null}" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </ListView.Style>
        </ListView>
    </StackPanel>
</Window>

Сказав все это, я не могу представить себе реальный сценарий, когда это то, что вы хотите сделать. Во-первых, щелчок правой кнопкой мыши на ListView (чтобы открыть контекстное меню) выберет элемент. Второе - я думаю, что это плохой дизайн интерфейса. Было бы лучше показать то же меню, но отключить элементы (все элементы в вашем случае). Таким образом, он дает пользователю указание на то, что всплывающее меню существует, но его функциональные возможности не включены прямо сейчас.

...