【问题标题】:Is it possible to disable ContextMenu when there's no item in the ListView or no item's selected?当 ListView 中没有项目或没有选择项目时,是否可以禁用 ContextMenu?
【发布时间】:2019-11-20 18:49:31
【问题描述】:

我使用了以下方法:

<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,如果我先选择一个项目然后右键单击它就可以正常工作。但是,如果我不选择任何项目并单击ListView 中的任意位置,它仍然会出现并使用null 调用命令。

【问题讨论】:

    标签: c# wpf listview contextmenu


    【解决方案1】:

    一种方法是在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>
    

    我希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      首先,将您的ContextMenu 移动到资源中,然后根据SelectedItem 是否为null 将其应用于DataTrigger 中的ListViewContextMenu

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

      【讨论】:

      • 这也有效。如果我能接受这两个答案作为我的问题的解决方案,那就太好了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      相关资源
      最近更新 更多