当 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
中的 ListView
的 ContextMenu
应用它=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
问题。这是通过将 ListViewItem
的 Tag
属性 设置为 ListView
的 DataContext
来完成的。这将允许 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>
希望对您有所帮助!
我使用了以下方法:
<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
中的 ListView
的 ContextMenu
应用它=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
问题。这是通过将 ListViewItem
的 Tag
属性 设置为 ListView
的 DataContext
来完成的。这将允许 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>
希望对您有所帮助!