最新要闻
- 资讯:建设银行e路通不用了直接扔了吗_建设银行e路通
- 恐怕人类永远也搞不定真正的AI!
- 环球时讯:黄仁勋带着NVIDIA新品发布会来了!RTX 4070梦碎
- 大量年轻人成为“果粉” :苹果连三星大本营都快攻陷了
- 精选!AGM G2 Guardian发布:全球首款500米范围热成像手机
- 全球时讯:不怕停电了?董明珠:格力开始研究将储能技术应用冰箱上
- 外敷仙人掌的禁忌和副作用_外敷仙人掌的禁忌
- 环球热文:官宣定档3月6日 领创科技旗舰荣耀Magic5系列即将国内亮相
- 需要去看医生的呼噜声什么样?这三种情况要特别注意:有危险
- 蔚来:阿尔卑斯全系车型采用800V方案 还将共享使用三代换电站
- 【全球新视野】男子反复发烧20多天被诊出黑热病:发病率仅0.0108/10万
- 环球快报:一加Buds Pro 2轻享版上架:48dB深度降噪
- 报告称每天工作超8小时心脏病风险增8成:很多公司拒绝996、启用四天工作制
- 比亚迪专业个性化品牌曝光:首车性能对标奔驰大G 年内发布
- 苹果将成本转嫁给果粉!2024年iPad Pro要大涨价
- LOL帧率近乎翻倍!Intel Arc A750新驱动测试:大幅提升、最大短板没有了
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
世界百事通!让WPF中的DataGrid像Excel一样可以筛选
在默认情况下,WPF提供的DataGrid仅拥有数据展示等简单功能,如果要实现像Excel一样复杂的筛选过滤功能,则相对比较麻烦。本文以一个简单的小例子,简述如何通过WPF实话DataGrid的筛选功能,仅供学习分享使用,如有不足之处,还请指正。
【资料图】
涉及知识点
在本示例中,从数据绑定,到数据展示,涉及知识点如下所示:
- DataGrid,要WPF提供的进行二维数据展示在列表控件,默认功能非常简单,但是可以通过数据模板或者控件模板进行扩展和美化,可伸缩性很强。
- MVVM,是Model-View-ViewModel的简写,主要进行数据和UI进行前后端分离,在本示例中,主要用到的MVVM第三方库为CommunityToolkit.Mvvm,大大简化原生MVVM的实现方式。
- 集合视图,要对DataGrid中的数据进行分组、排序和筛选,可以将其绑定到支持这些函数的CollectionView。 然后,可以在不影响基础源数据的情况下处理CollectionView中的数据。 集合视图中的更改反映在DataGrid用户界面 (UI) 中。
- Popup控件,直接继承FrameworkElement,提供了一种在单独的窗口中显示内容的方法,该窗口相对于指定的元素或屏幕坐标,浮动在当前Popup应用程序窗口上,可用于悬浮窗口。
示例截图
本示例主要模仿Excel的筛选功能进行实现,右键标题栏打开浮动窗口,悬浮于标题栏下方,既可以通过文本框进行筛选,也可以通过筛选按钮弹出右键菜单,选择具体筛选方式,截图如下所示:
选择筛选方式,弹出窗口,如下所示:
输入筛选条件,点击确定,或者取消筛选。如筛选学号里面包含2的,效果如下所示:
注意:以上筛选都是客户端筛选,不会修改数据源,也不会重连数据库。
核心源码
在本示例中,核心源码主要包含以下几个部分:
前端视图【MainWindow.xaml】源码
主要实现了按学号,姓名,年龄三列进行筛选,既可以单列筛选,又可以组合筛选。且三列的筛选实现方式一致,仅是绑定列有差异。
19 10 4111 39 4012 13 14 15 27 28 M608 864C588.8 864 576 851.2 576 832L576 448c0-6.4 6.4-19.2 12.8-25.6L787.2 256c6.4-6.4 6.4-19.2 0-19.2 0-6.4-6.4-12.8-19.2-12.8L256 224c-12.8 0-19.2 6.4-19.2 12.8 0 6.4-6.4 12.8 6.4 19.2l198.4 166.4C441.6 428.8 448 441.6 448 448l0 256c0 19.2-12.8 32-32 32S384 723.2 384 704L384 460.8 198.4 307.2c-25.6-25.6-32-64-19.2-96C185.6 179.2 217.6 160 256 160L768 160c32 0 64 19.2 76.8 51.2 12.8 32 6.4 70.4-19.2 89.6l-192 160L633.6 832C640 851.2 627.2 864 608 864z 29 3031 32 33 34 35 36 37 3842 31243 4644 45 54 7555 7456 57 5859 6360 6261 64 6865 6766 69 7370 7271 76 11077 10978 10879 8280 81 83 8784 85 86 88 9789 96 98 104 105 106 10799 103100 102101 111 145112 144113 143114 117115 116 118 122119 120 121 123 132124 131 133 139 140 141 142134 138135 137136 146 180 181147 179148 178149 152150 151 153 157154 155 156 158 167159 166 168 174 175 176 177169 173170 172171 182 227183 226184 225185 188186 187 189 194190 191 192 193 195 206196 197 204198 199 200 201 202 203 205 207 210208 209 211 222 223 224212 213 220214 215 216 217 218 219 221 228 269229 268230 267231 236232 233 234 235 237 248238 239 246240 241 242 243 244 245 247 249 252250 251 253 264 265 266254 255 262256 257 258 259 260 261 263 270 311271 310272 309273 278274 275 276 277 279 290280 281 288282 283 284 285 286 287 289 291 294292 293 295 306 307 308296 297 304298 299 300 301 302 303 305
业务逻辑【MainWindowViewModel】
业务逻辑处理主要复责数据初始化等业务相关内容,和UI无关,如下所示:
1 using CommunityToolkit.Mvvm.ComponentModel; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace DemoDataGrid 9 {10 public class MainWindowViewModel:ObservableObject11 {12 #region 属性及构造函数13 14 private Liststudents;15 16 public List Students17 {18 get { return students; }19 set { SetProperty(ref students, value); }20 }21 22 private List names;23 24 public List Names25 {26 get { return names; }27 set { SetProperty(ref names, value); }28 }29 30 private List nos;31 32 public List Nos33 {34 get { return nos; }35 set {SetProperty(ref nos , value); }36 }37 38 private List ages;39 40 public List Ages41 {42 get { return ages; }43 set {SetProperty(ref ages , value); }44 }45 46 47 48 public MainWindowViewModel()49 {50 this.Students= new List ();51 for (int i = 0; i < 20; i++) {52 this.Students.Add(new Student()53 {54 Id = i,55 Name = $"张{i}牛",56 Age = (i % 10) + 10,57 No = i.ToString().PadLeft(4, "0"),58 });59 }60 this.Nos= new List ();61 this.Names= new List ();62 this.Ages= new List ();63 this.Students.ForEach(s => {64 this.Nos.Add(new FilterInfo() { FilterText=s.No,IsChecked=false });65 this.Names.Add(new FilterInfo() { FilterText = s.Name, IsChecked = false });66 this.Ages.Add(new FilterInfo() { FilterText = s.Age.ToString(), IsChecked = false });67 });68 this.Ages=this.Ages.Distinct().ToList();//去重69 }70 71 #endregion72 73 74 }75 }
筛选功能实现【MainWindow.xaml.cs】
本示例为了简化实现,筛选功能处理主要在cs后端实现,如下所示:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Windows; 7 using System.Windows.Controls; 8 using System.Windows.Data; 9 using System.Windows.Documents; 10 using System.Windows.Input; 11 using System.Windows.Media; 12 using System.Windows.Media.Imaging; 13 using System.Windows.Navigation; 14 using System.Windows.Shapes; 15 16 namespace DemoDataGrid 17 { 18 ///19 /// Interaction logic for MainWindow.xaml 20 /// 21 public partial class MainWindow : Window 22 { 23 private MainWindowViewModel viewModel; 24 25 public MainWindow() 26 { 27 InitializeComponent(); 28 viewModel = new MainWindowViewModel(); 29 this.DataContext = viewModel; 30 } 31 32 33 #region 筛选 34 35 private void TextBlock_MouseRightButtonDown(object sender, MouseButtonEventArgs e) 36 { 37 if (sender != null && sender is TextBlock) 38 { 39 var textBlock = sender as TextBlock; 40 var tag = textBlock.Tag.ToString(); 41 var pop = this.FindName($"popup{tag}"); 42 if (pop != null) 43 { 44 var popup = pop as System.Windows.Controls.Primitives.Popup; 45 if (popup != null) 46 { 47 popup.IsOpen = true; 48 popup.PlacementTarget = textBlock; 49 popup.Placement = System.Windows.Controls.Primitives.PlacementMode.RelativePoint; 50 popup.VerticalOffset = 10; 51 popup.HorizontalOffset = 10; 52 } 53 } 54 } 55 } 56 57 private void TextBox_TextChanged(object sender, TextChangedEventArgs e) 58 { 59 TextBox textBox = e.OriginalSource as TextBox; 60 var tag = textBox.Tag;//条件 61 var text = textBox.Text; 62 if (tag != null) 63 { 64 if (tag.ToString() == "No") 65 { 66 Filter(this.lbNos.ItemsSource, this.txtNo.Text); 67 } 68 if (tag.ToString() == "Name") 69 { 70 Filter(this.lbNames.ItemsSource, this.txtName.Text); 71 } 72 if (tag.ToString() == "Age") 73 { 74 Filter(this.lbAges.ItemsSource, this.txtAge.Text); 75 } 76 } 77 78 } 79 80 private void Filter(object source, string filter) 81 { 82 var cv = CollectionViewSource.GetDefaultView(source); 83 if (cv != null && cv.CanFilter) 84 { 85 cv.Filter = new Predicate
学号,姓名,年龄三列过滤列表绑定内容模型一致,为FilterInfo,如下所示:
using CommunityToolkit.Mvvm.ComponentModel;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace DemoDataGrid{ public class FilterInfo : ObservableObject { private string filterText; public string FilterText { get { return filterText; } set { SetProperty(ref filterText, value); } } private bool isChecked; public bool IsChecked { get { return isChecked; } set { SetProperty(ref isChecked, value); } } }}
不足与思考
上述筛选实现方式,并非唯一实现,也并非最优实现,同样存在许多可以优化的地方。
在本示例中,存在许多冗余代码,如视图页面,对三列的弹出窗口,内容虽然相对统一,只是列名和绑定内容不同而已,却堆积了三大段代码,是否可以从控件模块或者数据模板的角度,进行简化呢?
筛选功能实现上,同样存在许多冗余代码,是否可以进行简化呢?以上是我们需要思考的地方,希望可以集思广益,共同学习,一起进步。
-
全球头条:Codeforces Round #854 by cybercats (Div. 1+2) 1799 A~G 题解
点我看题A RecentActions注意到只有编号大于n的博客会被更新,所以每当有一个之前没被更新的过的博客被...
来源: 全球播报:Rust 知识积累(1)
世界百事通!让WPF中的DataGrid像Excel一样可以筛选
全球头条:Codeforces Round #854 by cybercats (Div. 1+2) 1799 A~G 题解
全球报道:2363. 合并相似的物品
【天天速看料】c语言运算符优先级实例解析
资讯:建设银行e路通不用了直接扔了吗_建设银行e路通
恐怕人类永远也搞不定真正的AI!
环球时讯:黄仁勋带着NVIDIA新品发布会来了!RTX 4070梦碎
大量年轻人成为“果粉” :苹果连三星大本营都快攻陷了
精选!AGM G2 Guardian发布:全球首款500米范围热成像手机
全球时讯:不怕停电了?董明珠:格力开始研究将储能技术应用冰箱上
新消息丨.NET MAUI
外敷仙人掌的禁忌和副作用_外敷仙人掌的禁忌
环球热文:官宣定档3月6日 领创科技旗舰荣耀Magic5系列即将国内亮相
需要去看医生的呼噜声什么样?这三种情况要特别注意:有危险
蔚来:阿尔卑斯全系车型采用800V方案 还将共享使用三代换电站
【全球新视野】男子反复发烧20多天被诊出黑热病:发病率仅0.0108/10万
环球快报:一加Buds Pro 2轻享版上架:48dB深度降噪
今热点:11 款顶级 MySQL 图形化工具汇总,总有一款适合你!(建议收藏)
【速看料】Python实战项目3-前后端连接/首页轮播图表设计
热头条丨剑指 Offer 55 - II. 平衡二叉树(java解题)
焦点速讯:安装node并创建vue项目
报告称每天工作超8小时心脏病风险增8成:很多公司拒绝996、启用四天工作制
比亚迪专业个性化品牌曝光:首车性能对标奔驰大G 年内发布
苹果将成本转嫁给果粉!2024年iPad Pro要大涨价
LOL帧率近乎翻倍!Intel Arc A750新驱动测试:大幅提升、最大短板没有了
丰田有队友了!宝马氢燃料SUV将路试:16磅氢能跑500公里
世界速读:CSS中的BFC、IFC、GFC、FFC
环球即时:Synchronized,我要一层一层剥开你的心
全球视点!轻松玩转makefile|基础知识
环球聚焦:曝吴秀波儿子家暴成性,女方晒照满嘴是血,指证男方出轨乱约
周杰伦演唱会数百万人疯抢!演唱会门票30秒卖光
环球新资讯:长安发律师函控诉银河之光抄袭 吉利回应:毫无根据、误导公众
环球微速讯:【同步、共享和内容协作软件】上海道宁与ownCloud让您的团队随时随地在任何设备上轻松处理数据
全白外观拥有硬核实力!影驰Z790金属大师D5 Wi-Fi白金版主板评测:内存轻松提速10%
环球快讯:越来越多PC用户不愿买显卡了:2022年Q4桌面独显销量暴跌43%
世界第一次!中国空间站看到了在轨航天员的“三维皮肤”
【时快讯】89元 小米无线键鼠套装2上架:鼠标轻至45g
环球精选!运酒撞破酒缸1分钟损失5万!男子:一坛酒1000斤 1斤50块钱
天天快看点丨易基因|独家分享:高通量测序后的下游实验验证方法——DNA甲基化篇
IPO参考:联域光电拟深市主板IPO 郝氏控股二次递表港交所
【全球快播报】感冒的食疗偏方秘方_感冒的食疗偏方
8尺夫人面对面!《生化危机8 VR》IGN 8分 MTC用户9.7分
环球热点评!40多万的车没有语音控制功能!宝马遭X3车主集体投诉
今日聚焦!一加Ace 2V搭载旗舰级2.8D微弧玻璃:手感温润如玉
世界讯息:续航1整年!小米智能门锁M20大屏猫眼版开售:首发1899元
世界要闻:《艾尔登法环》原子之心机械姐妹花Mod 性感吸睛
自得其乐是什么意思?自得其乐的名人例子有哪些?
12%是零点几?12%公积金是什么档次?
给据邮件是什么意思?给据邮件如何填写?
男主角性格冰冷的小说有哪些?男主角性格冰冷的小说推荐
兔子能喝牛奶吗?兔子吃的食物有哪些?
小米手机屏幕校准在哪里?小米手机屏幕有多大?
集成显卡可以玩英雄联盟吗?集成显卡和独立显卡有什么区别?
华为mate9哪一年生产的?华为mate9参数配置
可视化图表之奥妙——百分比堆积条形图
看热讯:基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v6.2版已发布
常用的xpath
环球观察:mybatis plus映射postgreSQL数组
世界资讯:redis实现用户查询次数限制
军用三防手机有哪些?军用三防手机推荐
苏泊尔电磁炉滴滴响不加热是什么原因?苏泊尔电磁炉滴滴响不加热怎么解决?
最新资讯:完美全面屏!努比亚Z50 Ultra官宣3月7日发布
新消息丨控告抄袭!长安给吉利发去律师函
【环球新要闻】BBA压力来了!李想:今年理想将挑战30-50万豪华SUV市场20%份额
环球快消息!SRC挖掘之Access验证校验的漏洞挖掘
【世界热闻】tomcat源码分析(一)如何启动服务
协同办公领域未来三大趋势(协同办公带来的机遇)
彻底理解 HashMap 及 LinkedHashMap,面试官请随便问!
当前焦点!轻量级CI/CD发布部署环境搭建及使用_02_docker安装jenkins
世界微速讯:理想汽车2022年亏损额创新高达20.32亿元
天天热议:腾势D9首创双枪充电 赵长江:比高压充电更节省社会成本
当前视讯!DXO排名全球第一!京东方认领荣耀Magic5/Pro屏幕
【全球播资讯】史诗级更新!雷军:小米12S Ultra 2倍变焦快捷按键正式上线
环球时讯:巧妙利用“慧言”机器人在安全场景中实践
每日消息!iOS封闭垄断 俄罗斯怒罚苹果9.06亿卢布:后者服软已悄悄支付
李想:比亚迪汽车毛利率20%左右 跟理想汽车很接近 良心
世界最新:梅西第七次当选世界足球先生 FIFA年度最佳球员!网友泪目:实至名归
全球消息!游戏第一神U上新!AMD锐龙9 7950X3D超频后更强:性能完秒13900KS
天天热点!40吨重 我国长征九号重型火箭未来将发射大型天文望远镜:探测地外生命
湖人官方:詹姆斯明日因右脚伤势缺战灰熊
全球热消息:世界第二大水电站16台机组全部通过验收:自主研制 登顶世界水电
全球观速讯丨增程是落后技术?李想:理想汽车单车型研发投入中国行业最高
环球今热点:10多天还没到 市民吐槽快递延误 客服:你投诉去吧
读Java性能权威指南(第2版)笔记04_ Java SE API技巧下
天天速递!承诺员工1人1套房!董明珠被传与王自如恋爱 格力愤怒已报案
事与愿违下一句啥意思_事与愿违下一句是什么
天天观热点:一元二次方程
全球报道:k8s中的PV和PVC
观察:Canvas画布
印尼16月大男婴重达27公斤:比8岁男童还重
焦点日报:最后一天赶紧换!苹果iPhone等设备全系电池明天涨价:最贵519元
关注:茶颜悦色回应满杯奶茶放久了变半杯:奶沫放久了会自己消掉
每日看点!小米Wi-Fi 7路由器BE7000亮相:4个2.5G口 定价千元买吗?
当前视点!3名《炉石传说》电竞运动员注册成功:然而暴雪禁止中国玩家参加炉石赛事
环球聚焦:东川区开展校园周边环境专项集中整治行动
资讯推荐:冒险岛辅助2023_冒险岛多趣辅助
记录写了6年代码的心得
今亮点!Django uwsgi问题解析
全球新消息丨不坑盒子:word/wps最强辅助工具2023最新版