如何在未选择任何内容时禁用ListView上下文菜单?

时间:2012-03-03 02:43:36

标签: wpf mvvm contextmenu

我在WPF中将ListView设置为GridView,它有一个上下文菜单。如何在ListView中选择某些内容时启用上下文菜单?

我想在XAML中完成所有这些操作以遵循MVVM模式,所以任何帮助都会很好。

1 个答案:

答案 0 :(得分:1)

您应该使用触发器。首先将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(弹出上下文菜单)将选择一个项目。第二 - 我认为这是一个糟糕的UI设计。最好显示相同的菜单,但禁用项目(您的案例中的所有项目)。这样,它为用户提供弹出菜单存在的指示,但其功能目前尚未启用。