WPF的ListView绑定CheckBox数据并显示序号

[WPF 自定义控件]创建包含CheckBox的ListBoxItem 1. 前言 Xceed wpftoolkit提供了一个CheckListBox,效果如下: 不过它用起来不怎么样,与其这样还不如参考UWP的ListView实现,而且动画效果也很好看: 它的样式如下: <ListViewItemPresenter ContentTransitions="{TemplateBinding ContentTransitions}" x:Name="R... 阅读详情

我们想在ListView中添加CheckBox数据,并且需要添加序号。

效果

最后效果如图:
在这里插入图片描述

XAML里的代码

首先xaml里面我们添加

        <ListView x:Name="lvRules" Grid.Column="1"  AlternationCount="1000000"  SelectionChanged="lbRules_SelectionChanged" MouseDown="lbRules_MouseDown" MouseDoubleClick="lbRules_MouseDoubleClick" >
             <ListView.Resources>
                 <local:IndexConverter x:Key="IndexConverterNum"  AddValue="1"/>
             </ListView.Resources>
           
             <ListView.View>
                 <GridView x:Name="lvRuleListView" >
                     <GridViewColumn Header="执行顺序" Width="80" >
                         <GridViewColumn.CellTemplate >
                             <DataTemplate>
                                 <CheckBox IsChecked="{Binding isEnable}">
                                     <TextBlock Text="{Binding (ItemsControl.AlternationIndex) ,
RelativeSource={RelativeSource AncestorType=ListViewItem},Converter={StaticResource IndexConverterNum}}" />
                                 </CheckBox>
                             </DataTemplate>
                         </GridViewColumn.CellTemplate>
                     </GridViewColumn>
                     <GridViewColumn x:Name="gvcRuleName" Header="规则名称"  DisplayMemberBinding="{Binding ruleName}" />
                     <GridViewColumn x:Name="gvcDesc" Header="规则描述"  DisplayMemberBinding="{Binding ruleDesc}" />
                 </GridView>
             </ListView.View>
         </ListView>

我们需要添加DataTemplate在GridViewColumn 中,并且绑定数据列表listRuleDatas

我的数据结构是这样的

脚本代码

public class RuleInfoData
{
    public bool isEnable { get; set; }
    public string ruleName { get; set; }
    public string ruleDesc { get; set; }
}

在脚本中我们的业务逻辑里添加和绑定数据

listRuleDatas = new List<RuleInfoData>();
listRuleDatas.Add(new RuleInfoData { isEnable = true, ruleName = nowInfo.ruleName , ruleDesc = showtxt });
lvRules.ItemsSource = listRuleDatas;

刷新数据可以用

lvRules.Items.Refresh();

关于序号

序号我们可以设置AlternationCount=“1000000”,然后显示的时候通过Binding (ItemsControl.AlternationIndex)来显示,序号是从0开始的,我们这里需要通过Converter来改变序号。

public class IndexConverter : IValueConverter
{
    public int AddValue { get; set; }

    public object Convert(object value, Type TargetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int curentvalue = (int)(value);
        curentvalue += AddValue;

        return curentvalue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int curentvalue = (int)(value);
        curentvalue -= AddValue;
        return curentvalue;

    }
}

函数定义好后需要添加Resources

<ListView.Resources>
                 <local:IndexConverter x:Key="IndexConverterNum"  AddValue="1"/>
</ListView.Resources>

否则会报错,找不到IndexConverterNum

最后就运行就可以看到效果了。

点击CheckBox处理

我们可能还需要点击CheckBox进行数据变动。我们可以利用CheckBox的Tag来处理。
我们可以把编号添加到CheckBox的Tag,这样我们点击Tag就知道是哪一条数据了,这样做实现起来比较简单。或者也可以直接获取((TextBlock)cbBox.Content).Text,如果仅仅是个数字的话。

<GridViewColumn.CellTemplate >
	<DataTemplate>
		<CheckBox IsChecked="{Binding isEnable}" Tag="{Binding (ItemsControl.AlternationIndex) ,
RelativeSource={RelativeSource AncestorType=ListViewItem},Converter={StaticResource IndexConverterNum}}" Click="CheckBox_Click">
			<TextBlock Text="{Binding (ItemsControl.AlternationIndex) ,
RelativeSource={RelativeSource AncestorType=ListViewItem},Converter={StaticResource IndexConverterNum}}" />
		</CheckBox>
	</DataTemplate>
</GridViewColumn.CellTemplate>

后台代码里

//点击规则开关
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
    CheckBox cbBox = sender as CheckBox;
    if (cbBox != null)
    {
        //((TextBlock)cbBox.Content).Text
        int index = int.Parse(cbBox.Tag.ToString()) - 1;
        lvRules.SelectedIndex = index;
       
    }

}

ListView实现简单拖拽

首先xmsl里的Listview需要添加

AllowDrop="True" MouseMove="lvRules_MouseMove" Drop="lvRules_Drop"

首先鼠标移动事件增加

private void lvRules_MouseMove(object sender, MouseEventArgs e)
{
    if (sender is ListView listview
                 && e.LeftButton == MouseButtonState.Pressed
                 && listview.SelectedItem != null)
    {
        DragDrop.DoDragDrop(listview, listview.SelectedItem, DragDropEffects.Move);
        //tbStat.Text = "lvRules_MouseMove";
    }
}

然后是释放

private void lvRules_Drop(object sender, DragEventArgs e)
{
    
    object data = e.Data.GetData(typeof(RuleInfoData));
    if (data is RuleInfoData)
    {
    	//根据位置信息获得index
        int insert_index = GetCurrentIndex(new GetPositionDelegate(e.GetPosition));
        if (insert_index == -1)
            return;
        //这里就可以处理插入了。
    }
}
private int GetCurrentIndex(GetPositionDelegate getPosition)
{
    int index = -1;
    if (lvRules.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
        return index;
    for (int i = 0; i < lvRules.Items.Count; ++i)
    {
        ListViewItem item = lvRules.ItemContainerGenerator.ContainerFromIndex(i) as ListViewItem;
        if (item != null && this.IsMouseOverTarget(item, getPosition))
        {
            index = i;
            break;
        }
    }
    return index;
}

delegate Point GetPositionDelegate(IInputElement element);
private bool IsMouseOverTarget(Visual target, GetPositionDelegate getPosition)
{
    Rect bounds = VisualTreeHelper.GetDescendantBounds(target);
    Point mousePos = getPosition((IInputElement)target);
    return bounds.Contains(mousePos);
}

参考文献

https://learn.microsoft.com/en-us/dotnet/desktop/wpf/controls/how-to-style-a-row-in-a-listview-that-implements-a-gridview?view=netframeworkdesktop-4.8

https://stackoverflow.com/questions/660528/how-to-display-row-numbers-in-a-listview

https://blog.youkuaiyun.com/yysyangyangyangshan/article/details/8951677

https://blog.youkuaiyun.com/porenasckx/article/details/8198157

WPF中ListView排序实现(2022.12.25有更新) 要实现ListView点击某一列进行排序,需要处理列点击事件 <Windowx:Class="ListViewSort.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow"Height="300"Width="300"... 阅读详情

相关推荐

WPF CheckBox绑定枚举数据源(数据列表)

WPF在MVVM模式下通过Converter控制不同CheckBox对应不同枚举类型勾选,比如我现在描述一个人有八种行为,这八种行为分别通过8个CheckBox来标识,如果存在这种行为则勾选,不存在则不勾选

wpf listview内嵌checkbox

1.xaml添加 <ListView x:Name="ls_xxxx"> <ListView.View> <GridView> <GridView.Columns> <GridViewColumn>

qq_38082979的博客 1496

WPF ListView控件中CheckBox全选联动

WPF 使用MVVM设计模式对进行增删改操作 具体内容可以看我的博客:https://blog.youkuaiyun.com/Dear200892/article/details/78849632

WPF实现CheckBoxListView

在Win7的资源管理器中,如果我们选中【文件夹选项】->【查看】->【文件和文件夹】->【使用复选框以选择项】。则可通过列表项上的复选框实现多选,而不再需要按【Ctrl】或【Shift】键。WPF中没有对应的控件,但是利用WPF我们可以比较容易实现此功能。讨论 首先,CheckBox的选中状态应该和ListViewItem的选中状态保持一致,故需要将CheckBox的I...

weixin_30794851的博客 711

汇川EASY系列之以太网通讯(MODBUS_TCP做从站)

汇川easy系列PLC做MODBUS_TCP从站,,ModbusTCP服务器默认开启,无需设置通信协议(即不需要配置),端口号为“502”。ModbusTCP从站最多支持31个ModbusTCP客户端(ModbusTCP主站)同时连接。

这是一个长期关注工控行业技术的博客,实现0-1的突破,期待您的关注和留言 8902

SRv6第二弹:SRv6基本概念

在SRv6网络编程中,不同的转发行为由不同的Function来标识,例如在RFC中定义了公认的End、End.X、End.DX4、End.DX6等。例如:R3使用报文的IPv6目的地址FC03::3查找Local SID表,命中到End SID,随后R3将报文SL减1,同时将SL=1的SID做为报文目标IPv6地址,并查路由表转发出去。SID支持静态配置或者动态分配,end-op、end、end.x、end-dt4、end-dt6、end-dx2推荐静态配置 ,便于网络运维,其他的SID可以动态分配。

wbyyy的博客 4251

WPF中ListView绑定Dictionary,顺带提右键菜单和checkbox

Dictionary需要指定的Value是一个Object,如Student类。ListView需要支持右键菜单。每个条目要有Checkbox表示是否选中。 给出前台代码:<Page x:Class="CET.ExamViewer.PageControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/pres

8251

激光可燃气体传感器:核心技术环节分析

激光可燃气体传感器核心技术涵盖七个维度:1)TDLAS光谱吸收与调制技术(检测下限ppm级);2)DFB激光器与双闭环温控系统(波长稳定性±0.0036nm);3)微弱信号处理技术(信噪比提升60dB);4)环境补偿算法(温压补偿误差<±1%);5)本质安全防爆设计(ExiaIICT4Ga等级);6)智能边缘计算(STM32L476芯片);7)多重性能验证(响应时间<1秒)。通过微型化、多气体检测等创新,该技术已在工业安全等领域替代传统方案,实现高精度检测。(149字)

上市公司前技术负责人,20 年软硬件深耕 + 百人研发团队管理经验,名校理工科背景加持。从技术攻坚到团队掌舵,沉淀海量项目实战与管理心得,专注分享软硬件干货、疑难问题解决方案,既是靠谱知识传播者,也盼链接优质项目共成长。 1045

WPF中为ListView动态绑定数据(可参考)

GridView gv =newGridView(); DataTable dt = fieldManageBLL.GetFieldManage(moduleName); for(inti=0;i<dt.Rows.Count;i++) { if(i==0) { GridViewColumn gvc=newGridViewColumn(); ...

weixin_30955341的博客 1217

基于ESP32的智能无线广播系统开发博客

通过本项目的开发,我们成功地实现了基于ESP32的智能无线广播系统。该系统不仅具备传统广播的功能,还实现了通过Wi-Fi无线传输音频、实时广播和智能控制等多种先进功能。未来,随着技术的进一步发展,我们还可以扩展更多功能,如智能推荐广播内容、支持语音识别和控制等。希望本项目能够为嵌入式开发人员提供一些思路和参考,帮助大家在实际开发中更好地应用ESP32平台,开发出更加智能和实用的无线广播系统。

2201_76125393的博客 424

出现 Error occurred during initialization of VMagent library failed Agent OnLoad 解决方法

ntelliJ IDEA启动时出现"Agent library failed to load"错误,主要原因是JVM代理加载失败。解决方法包括:1)完全卸载并删除用户目录下的JetBrains配置文件;2)检查并修改idea64.exe.vmoptions文件,确保路径正确并删除不必要的-javaagent参数;

码农研究僧的博客 2485

WPF中为ListView动态绑定数据且添加一列复选框

GridView gv = new GridView(); DataTable dt = fieldManageBLL.GetFieldManage(moduleName); for(int i=0;i&lt;dt.Rows.Count;i++) { if(i==0) { GridViewColumn gvc=new GridViewColumn(); CheckBo...

weixin_34248023的博客 352

《干货满满!AI 应用架构师打造 AI 驱动生产计划的实战技巧》

生产计划是制造企业的“大脑”——它决定了买什么物料、产多少产品、用什么设备、什么时候交货,直接影响企业的成本、效率和客户满意度。需求预测靠经验,误差常超20%;排产依赖Excel,调整一次要3天;供应链协同靠邮件,物料延迟导致停产屡见不鲜。作为AI应用架构师,我们的任务是用AI重新“激活”这个“大脑”——用数据驱动的预测替代经验判断,用智能优化替代人工排产,用实时协同替代被动响应。本文结合3个制造业实战案例5段可运行代码2个数字孪生模型,从架构设计→核心模块实现→落地踩坑。

移动开发前沿的博客 1085

mvvm 模板中事件没有执行的解决方案

今天在wpf设计的过程中,用到了listview,数据绑定在模板中进行,其中有个按钮的click事件,一直不执行,很奇怪,找了很久才找到解决办法,原因还是暂时不清除: <ListView x:Name="LvwClass" ItemsSource="{Binding ClassCollection}" Grid.Column="1"> &...

weixin_30381317的博客 223

农业无人机:无人机图像处理_(8).遥感图像处理与分析

遥感图像处理与分析在农业无人机技术中具有重要作用,通过图像预处理、特征提取、分类与分割、目标检测等技术,可以实现对农田的精细管理、作物监测、病虫害预测等应用。本节详细介绍了这些技术的基本概念、常用方法和具体实现,希望对您在农业无人机图像处理方面的学习和应用有所帮助。

zhubeibei168的博客 1336

2020计算机专业保研夏令营面经:中科院计算所网数机试题目

计算所网络数据科学与技术重点实验室的第一阶段是机试。机试不限程序语言,要求提交源代码。

乔卿的博客 2957

WPF MVVM基础教程(四)复杂列表/数据绑定(集合绑定扩展)

复杂列表如ListView、DataGrid的绑定,类似集合绑定,集合中的类型换成了定义的类,如果集合需要发生变化的,依旧需要使用ObservableCollection或者其他继承自接口INotifyCollectionChanged的集合。集合绑定扩展,其他类似ListBox、ComboBox等 绑定多属性的类集合,让其显示其中一个属性,此时只需要设置DisplayMenmBerPath属性为需要显示的属性,ListBox中的项就会显示对应的属性值,而且其SelectedItem属性依旧

海盗Sharp的博客 7190

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

WPF简单实例,ListView数据绑定,CheckBox/Button删除操作

实现功能如下图,显示一个list的数据内容,并为每行添加checkbox复选框和单独按钮,来实现批量删除和单行删除. 数据源的结构非常简单,只有三个属性,分别是uid,username,password,分别对应用户id,用户名,密码 using System; using System.Collections.Generic; using System.Linq; using Sys

tbb026的专栏 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

wpf ListView自动序号,默认的序号字段

WPF ListView自动序号,默认序号字段

u011511086的专栏 999

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

checkbox wpf 绑定数组_将WPF CheckBox.IsChecked绑定到列表

假设我有几个复选框,在ViewModel中有一个字符串列表。public List Checks { get; set; }我的目标是以这样的方式将我的复选框绑定到列表,当复选框1被选中时,“复选1”将被添加到列表中,当它被选中时,“复选1”将被删除,依此类推。public class CheckBoxToListConverter : IValueConverter{List bound;pub...

weixin_36081148的博客 1164

WPF listview+checkbox自适应列宽

背景:在listview中使用checkbox,每添加一个数据,就在listview中放入一个checkbox; 问题:当新增数据比上一个数据长时,显示不全。 分析:当我滑动listview的header滑动条时可以显示完全,发现listview的列宽在控件第一次加载的时候已经确定,之后不会随着某列数据长度的增加和减少而改变列宽。。 解决思路:让listview自适应列宽。 测试代码: 1.xaml代码 <Window x:Class="ListViewTest.MainWindow"

qq_38082979的博客 1092

WPF中的几种绑定情况

在WPF中,前台控件应该很好的与数据进行绑定关联,不在像WinForm那样在后台拿着控件去操作,基于数据驱动的原则,写好绑定可以方便后台代码逻辑,并且代码看着更加简结。

weixin_45114627的博客 965

WPF的数据绑定

WPF 数据绑定

BeanGo的博客 7002

ListView 的三种数据绑定方式

1.最原始的绑定方式:   代码 public ObservableCollection&lt;object&gt; ObservableObj; public MainWindow() { InitializeComponent(); ObservableObj = new ObservableCollecti...

weixin_33935505的博客 612

C# wpf ListBox自动生成序号

概述 在使用列表的业务场景中有时需要给列表加上序号,比如做一个排名的列表等。ListBox本身不支持显示序号,也没有相关的属性获取当前元素的序号。需要添加序号,通常就需要将业务层的实体直接添加序号属性,或再包装一层,添加序号属性。这样做会对业务逻辑造成一定的改动,对于不在乎代码架构的开发人员,也没什么影响。但笔者比较在乎业务逻辑和界面的分层,添加序号这种功能,很明显可以完全交给界面层去完成,业务层更换任何实体都依然可以显示序号,而不用拓展实体。 实现方法 尝试过多种方式实现自动添加序号,比如:使用在styl

codeofcc的博客 2083
上一篇: Bat批处理知识点 - 技巧合集
下一篇: PVE软路由All-In-One的安装和网络拓扑
Thinbug
博客等级 码龄22年 2万+粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinbug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值