当 ListView 中没有项目或没有选择项目时,是否可以禁用 ContextMenu?

Is it possible to disable ContextMenu when there's no item in the ListView or no item's selected?

我使用了以下方法:

<ListView x:Name="itemsListView" ItemsSource="{Binding MyItems}">
    <ListView.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Remove"
        Command="{Binding RemoveItem}"
        CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem}" />
        </ContextMenu>
    </ListView.ContextMenu>
</ListView>

由 blindmeis here 提供,用于创建和绑定 ContextMenu,如果我先 select 一个项目然后右键单击,它工作正常。但是,如果我不 select 任何项目并单击 ListView 中的任意位置,它仍然会出现并使用 null 调用命令。

首先,将您的 ContextMenu 移动到资源中,然后根据 DataTrigger 中的 ListViewContextMenu 应用它=15=]是否为null

<Window.Resources>
    <ContextMenu x:Key="MyContextMenu">

        <MenuItem Header="Remove"
                  Command="{Binding RemoveItem}"
                  CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem}" />
    </ContextMenu>
</Window.Resources>
<Grid>
    <ListView x:Name="itemsListView" ItemsSource="{Binding MyItems}">
        <ListView.Style>
            <Style TargetType="{x:Type ListView}">
                <Setter Property="ContextMenu"
                        Value="{StaticResource MyContextMenu}" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding SelectedItem, ElementName=itemsListView}"
                                 Value="{x:Null}">
                        <Setter Property="ContextMenu"
                                Value="{x:Null}" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ListView.Style>
    </ListView>
</Grid>

一种方法是在 ListViewItem 上设置 ContextMenu 而不是 ListView

这将确保 ContextMenu 仅在有 ListViewItem 可用时显示。如果未选择该项目,则会在用户右键单击它时选择。

这里唯一的技巧是处理 ContextMenu 中的 DataContext 问题。这是通过将 ListViewItemTag 属性 设置为 ListViewDataContext 来完成的。这将允许 ContextMenu 绑定到 RemoveItem 命令。

<ListView x:Name="ItemsListView"
    Width="200"
    Height="300"
    HorizontalAlignment="Center"
    VerticalAlignment="Center"
    ItemsSource="{Binding MyItems}">
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        <MenuItem
                            Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.Tag.RemoveItem}"
                            CommandParameter="{Binding}"
                            Header="Remove" />
                    </ContextMenu>
                </Setter.Value>
            </Setter>
            <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListView}}, Path=DataContext}" />
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

希望对您有所帮助!