WPF 根据指定条件显示或禁止listView中的每一项的右键菜单

昨天要做一个ListView的右键菜单,需要根据listView绑定的集合中每个对象里的一个bool属性来决定是否显示该项的右键菜单,经过不懈的尝试和努力,最终实现了两种方案,一种是当该值为false时,可以点出右键菜单,但菜单项置灰不可选;另一种就是直接不出来菜单,右击没反应。下面是第一种方案:

     <ListView x:Name="ServerList" ItemsSource="{Binding Path=Servers}">
            <ListView.Resources >
                <Style x:Key="CheckMenuItem" TargetType="{x:Type MenuItem}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=IsLogin, Converter={StaticResource Bool2String}}" Value="True">
                            <Setter Property="IsEnabled" Value="False"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
                <ContextMenu x:Key="ContextMenuItem">
                    <MenuItem Header="play with her" Style="{StaticResource CheckMenuItem}"/>
                    <MenuItem Header="kiss her" Style="{StaticResource CheckMenuItem}"/>
                </ContextMenu>
            </ListView.Resources>
            <ListView.ItemContainerStyle>
                <Style TargetType="{x:Type ListViewItem}">
                    <Setter Property="ContextMenu" Value="{StaticResource ContextMenuItem}"/>
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="服务器" Width="485" DisplayMemberBinding="{Binding ServerName}"/>
                </GridView>
            </ListView.View>
        </ListView>

在这段代码中,数据源servers是一个ObservableCollection<ServerViewModel>类型,而dataTrigger中绑定的变量IsLogin是ServerViewModel中的一个bool属性,用它来决定listView中某一项的右键菜单是否可用。

第二种方案:

 <ListView   x:Name="listView" HorizontalAlignment="Left" Height="100" Margin="9,82,0,0" VerticalAlignment="Top" Width="auto" ItemsSource="{Binding Path=Servers}">
         <ListView.Resources>
            <ContextMenu x:Key="ct">
                  <MenuItem Header="play with her" />
                  <MenuItem Header="kiss her" />
            </ContextMenu>
         </ListView.Resources>
         <ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}">
               <Setter Property="ContextMenu" Value="{StaticResource ct}"></Setter>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=IsLogin, Converter={StaticResource bool2string}}" Value="True">
                            <Setter Property="ContextMenuService.IsEnabled" Value="False"/>
                        </DataTrigger>
                    </Style.Triggers>
            </Style>
         </ListView.ItemContainerStyle>
         <ListView.View>
            <GridView>
               <GridViewColumn Header="header" Width="485" DisplayMemberBinding="{Binding ServerName}"/>
            </GridView>
         </ListView.View>
      </ListView>

这个方法和上一个不同的地方在于上一个方法是根据条件改变右键菜单(ContextMenu)里的项(MenuItem)的状态,可用或者不可用,而这个方法是根据条件决定ListView里的每一项(ListViewItem)是否显示右键菜单,就是修改ContextMenuService.IsEnabled的值。

另外再给大家分享一下我之前尝试失败的方法,大家参考一下,第一种:

      <ListView.Resources>
                <Style x:Key="CheckContextMenu" TargetType="{x:Type ContextMenu}">
                       <Style.Triggers>
                          <DataTrigger Binding="{Binding Path=IsLogin, Converter={StaticResource bool2string}}" Value="True">
                             <Setter Property="Visibility" Value="Collapsed"/>
                          </DataTrigger>
                       </Style.Triggers>
                 </Style>
                <ContextMenu x:Key="ct" Style="{StaticResource CheckContextMenu}">
                    <MenuItem Header="play with her" />
                    <MenuItem Header="kiss her" />
                </ContextMenu>
            </ListView.Resources>

就是在resoures里给contextMenu加style,这种方式实现出来有bug, 就是当点击允许显示菜单的项时没有问题,当点击不允许显示菜单的项时也不会显示菜单,但是点击了不允许显示菜单的项之后再去点击允许显示菜单的项时,显示的菜单是上一个本来不允许显示菜单的项的菜单。这是什么原因造成的我也没去研究。

第二种:

        <ListView.Style>
                <Style>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding SelectedItem.IsLogin}" Value="True">
                            <Setter Property="ContextMenuService.IsEnabled" Value="True"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ListView.Style>

这样子也是行不通的。

好的,今天就写到这里,周六下午来公司写blog,写完感觉蛮充实的,时间没有浪费,晚上去看电影哇卡卡卡卡卡

原文地址:https://www.cnblogs.com/growingzx/p/WPF_ListView_RestrictContextMenu.html

时间: 2024-10-16 02:55:10

WPF 根据指定条件显示或禁止listView中的每一项的右键菜单的相关文章

LISTVIEW嵌套GRIDVIEW的一些处理(点击GRIDVIEW的条目,能够显示他在LISTVIEW中的位置)(对这篇文章的优化处理,不每次都new onItemClickListener)

前几天写了点击GRIDVIEW的条目,能够显示他在LISTVIEW中的位置,当时的处理是在ListView的适配器里的GetView方法里每次都new GridView的onItemClickListener,这样显然是不合理的, /**GridVIew的条目点击监听*/ private GvOnItemClickListener mGvOnItemClickListener;//成员 这是Fragment的入口: @Override public View onCreateView(Layou

wpf 将Style应用到 ListView 中的 ListViewItem 元素

例: 为每个条目元素设置右键菜单 1. 新建右键菜单元素和样式元素 注意: 同时设置样式元素的 TargetType 属性和 x:Key 属性, 将样式元素限定为应用于 ListViewItem 类型元素并且需要显示指定才可应用 <Window.Resources> <ContextMenu x:Key="ContextMenuTest"> <MenuItem Header="右键菜单1"/> <MenuItem Heade

UWP: ListView 中与滚动有关的两个需求的实现

在 App 的开发过程中,ListView 控件是比较常用的控件之一.掌握它的用法,能帮助我们在一定程度上提高开发效率.本文将会介绍 ListView 的一种用法--获取并设置 ListView 的滚动位置,以及获取滚动位置处的项目.这里多说一句,由于这个描述有点,所以本文的标题实在不好起. 举个例子,如果你正在开发的应用有这样一个需求,当用户从一个列表页(包括 ListView 控件)返回到前一页面时,你需要得到用户在浏览 ListView 中的内容到哪个位置以及哪一项了,以便告诉用户最近浏览

Android入门 在ListView中如何进行精确的定位

在android的开发中,经常会遇到需要主动去设定某条ListItem的位置的需求.设置位置的函数有 ListView.setSelection(int position) ListView.setSelectionFromTop(int position, int y); 其中 position指的是指定的item的在ListView中的索引,注意如果有Header存在的情况下,索引是从Header就开始算的. y指的是到ListView可见范围内最上边边缘的距离. 函数有了,现在就是根据自身

用WPF实现在ListView中的鼠标悬停Tooltip显示

原文:用WPF实现在ListView中的鼠标悬停Tooltip显示 一.具体需求描述 在WPF下实现,当鼠标悬停在ListView中的某一元素的时候能弹出一个ToolTip以显示需要的信息. 二.代码实现 在.XMAL文件中 Code<Window.Resources> <DataTemplate x:Key="dataTemplateCheckBox"> <StackPanel Orientation="Horizontal">

WPF之让ListView中的CheckBox居中显示

第一步:在资源中定义一个居中的样式: <Window.Resources> <Style x:Key="ListViewItemStyle" TargetType="{x:Type ListViewItem}"> <Setter Property="HorizontalContentAlignment" Value="Stretch"/> </Style> </Window

C# 将Access中时间段条件查询的数据添加到ListView中

C# 将Access中时间段条件查询的数据添加到ListView中 一.让ListView控件显示表头的方法 在窗体中添加ListView 空间,其属性中设置:View属性设置为:Detail,Columns集合中添加表头中的文字. 二.利用代码给ListView添加Item. 首先,ListView的Item属性包括Items和SubItems.必须先实例化一个ListIteView对象.具体如下: ListViewItem listViewItem=new ListViewItem(); l

oracle 统计指定条件下所有表的行数

今天 需要统计下指定用户下的所有表的行数,于是采用了oracle 内置视图: select table_name,num_rows  from dba_tables where owner = 'USERNAME';  或 select table_name,num_rows from user_all_tables ; 可是统计结果发现,有的表的统计数量和实际数量有差异,因此,直接自己写了个统计指定条件下表的记录的sql: --创建一个表用于存储计算结果 create table t_temp

未经处理的异常在 System.Data.dll 中发生。其他信息:在应使用条件的上下文(在 &#39;***&#39; 附近)中指定了非布尔类型的表达式。

机房收费系统中,有些人在联合查询这个模块用的是存储过程,我先尝试着在数据库中建立了一个视图,然后在UI层做个判断并生成查询条件strCondition. 在机房收费系统的"联合查询"模块中出现的问题:"System.Data.SqlClient.SqlException"类型的未经处理的异常在 System.Data.dll 中发生.其他信息: 在应使用条件的上下文(在 '@strCondition' 附近)中指定了非布尔类型的表达式. 出错的DAL层代码为: Pu