WPF 【十月的寒流】学习笔记(1):DataGrid过滤
文章目录
- 相关链接
- 代码仓库
- 前言
- 环境
- DataGrid 数据筛选
- 项目配置
- 使用原理
- 主要代码(详细代码可以看我的GitHub仓库)
- Models.Person
- DataGirdView
- DataGridViewModel
- 实现效果
- DataGrid直接绑定CollectionView
- xaml
- ViewModel
- 总结
相关链接
十月的寒流
在 WPF 中制作 DataGrid 的数据筛选功能
WPF 中如何制作 DataGrid 的分页功能
代码仓库
我为了方便展示源代码,我将代码提交到了代码仓库里面
B站【十月的寒流】对应课程的代码 Github仓库
前言
为了深入的重新学习WPF的基础知识,打算从【B站:十月的寒流】这位大佬上面去学习WPF的相关的知识。我其实更推荐大家去看原视频的相关教程内容。
环境
- visual studio 2022
- .net core 8.0
- windows11
DataGrid 数据筛选
项目配置
如何使用我这里就不展开说明了
WPF CommunityToolkit.Mvvm
WPF CommunityToolkit.Mvvm Messenger通讯
WPF-UI HandyControl 简单介绍
WPF-UI HandyControl 控件简单实战+IconPacks矢量图导入
Bogus,.NET生成批量模拟数据
使用原理
WPF DataGrid 数据过滤
ICollectionView让MVVM更简单
微软官方文档|ICollectionView 接口
这里不得不提到微软的WPF文档了,写了和没写差不多。
实现原理就是微软为了方便对数据进行分组、排序和筛选。给ItemSorce添加了ICollectionView 专门用于干这个。然后我们可以对ICollectionView添加规则,Ture就是需要,False就是不需要。
主要代码(详细代码可以看我的GitHub仓库)
Models.Person
public class Person{public int Id { get; set; }public string FullName { get; set; }public string FirstName { get; set; }public string LastName { get; set; }public DateTime BirthDay { get; set; }}
DataGirdView
<UserControl x:Class="DataGrid_Filter.Views.DataGirdView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:local="clr-namespace:DataGrid_Filter.Views"xmlns:hc="https://handyorg.github.io/handycontrol"xmlns:viewModels="clr-namespace:DataGrid_Filter.ViewModels"mc:Ignorable="d"d:DesignHeight="450"d:DesignWidth="800"><UserControl.DataContext><viewModels:DataGridViewModel x:Name="ViewModel" /></UserControl.DataContext><DockPanel LastChildFill="True"><StackPanel DockPanel.Dock="Bottom"Orientation="Horizontal"Margin="5"><Button Command="{Binding AddItemCommand}"Content="AddNewItem" /><!--添加名称,方便绑定--><hc:TextBox Text="{Binding FilterStr,UpdateSourceTrigger=PropertyChanged}"hc:InfoElement.Placeholder="Filter By Name"MinWidth="200"Margin="5 0 0 0"x:Name="FilterBox" /></StackPanel><!--添加名称,方便绑定--><DataGrid ItemsSource="{Binding PeopleList}"x:Name="PeopleDataGrid"></DataGrid></DockPanel>
</UserControl>
public partial class DataGirdView : UserControl{public DataGirdView(){InitializeComponent();//将主要的代码逻辑放在ViewModel里面ViewModel.DataGirdView = this;}}
DataGridViewModel
public partial class DataGridViewModel : ObservableObject{[ObservableProperty]private string title = "DataGird Tttle";[ObservableProperty]private ObservableCollection<Models.Person> peopleList = new();[ObservableProperty]private ICollectionView collectionView;[ObservableProperty]private string filterStr = "";private DataGrid_Filter.Views.DataGirdView dataGirdView;public DataGrid_Filter.Views.DataGirdView DataGirdView{get => dataGirdView;set {dataGirdView = value;ViewInit();}}public static int OrderId = 1;/// <summary>/// 生成模拟的数据/// </summary>public static Faker<Models.Person> Faker = new Faker<Models.Person>().RuleFor(t => t.Id, f => OrderId++).RuleFor(t => t.FirstName, f => f.Name.FirstName()).RuleFor(t => t.LastName, f => f.Name.LastName()).RuleFor(t => t.FullName, f => f.Name.FullName()).RuleFor(t => t.BirthDay, f => f.Date.Between(new DateTime(1990, 1, 1), new DateTime(2010, 1, 1)));public DataGridViewModel(){PeopleList = new ObservableCollection<Models.Person>(Faker.Generate(10));}[RelayCommand]public void AddItem(){var item = Faker.Generate();PeopleList.Add(item);}public void ViewInit(){//获取ItemSource的CollectionViewCollectionView = CollectionViewSource.GetDefaultView(DataGirdView.PeopleDataGrid.ItemsSource);//给CollectionView添加过滤规则CollectionView.Filter = (item) =>{if (string.IsNullOrEmpty(FilterStr)){return true;}else{var model = item as Models.Person;return model.FirstName.Contains(FilterStr) || model.LastName.Contains(FilterStr) || model.FullName.Contains(FilterStr);}};//在TextChanged的时候,实时更新DataGirdView.FilterBox.TextChanged += (s, e) =>{CollectionView.Refresh();};}}
实现效果
DataGrid直接绑定CollectionView
第一种方法是通过获取ItemSorce来获取CollectionView,实在是舍近求远。这次我们选择第二种方法。直接绑定设置好的CollectionView。然后我们在每次刷新输入框和改动数据的时候,主动更新绑定内容。
xaml
<UserControl x:Class="DataGrid_Filter.Views.DataGrid2View"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:DataGrid_Filter.Views"xmlns:viewModels="clr-namespace:DataGrid_Filter.ViewModels"xmlns:hc="https://handyorg.github.io/handycontrol"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><UserControl.DataContext><viewModels:DataGrid2ViewModel /></UserControl.DataContext><Grid><DockPanel LastChildFill="True"><StackPanel DockPanel.Dock="Bottom"Orientation="Horizontal"Margin="5"><Button Command="{Binding AddItemCommand}"Content="AddNewItem" /><!--添加名称,方便绑定--><hc:TextBox Text="{Binding FilterStr,UpdateSourceTrigger=PropertyChanged}"hc:InfoElement.Placeholder="Filter By Name"MinWidth="200"Margin="5 0 0 0"x:Name="FilterBox" /></StackPanel><!--添加名称,方便绑定--><DataGrid ItemsSource="{Binding CollectionView}"x:Name="PeopleDataGrid"></DataGrid></DockPanel></Grid>
</UserControl>
ViewModel
using Bogus;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using DataGrid_Filter.Views;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;namespace DataGrid_Filter.ViewModels
{public partial class DataGrid2ViewModel : ObservableObject{[ObservableProperty]private List<Models.Person> people = new List<Models.Person>();[ObservableProperty]private ICollectionView collectionView;private string filterStr = "";public string FilterStr{get{return filterStr;}set{SetProperty(ref filterStr, value);CollectionView.Refresh();}}[RelayCommand]public void AddItem(){var item = DataGridViewModel.Faker.Generate();People.Add(item);CollectionView.Refresh();}public DataGrid2ViewModel(){People = DataGridViewModel.Faker.Generate(10).ToList();CollectionView = CollectionViewSource.GetDefaultView(People);CollectionView.Filter = (item) =>{if (string.IsNullOrEmpty(FilterStr)){return true;}else{var model = item as Models.Person;return model.FirstName.Contains(FilterStr) || model.LastName.Contains(FilterStr) || model.FullName.Contains(FilterStr);}};}}
}
总结
学WPF还是不能闭门造车,一定要先找网上有没有对应的方法,实在没有再自己想方法解决。【十月的寒流】的【WPF教程】确实不错,建议大家都去看一下。
相关文章:

WPF 【十月的寒流】学习笔记(1):DataGrid过滤
文章目录 相关链接代码仓库前言环境DataGrid 数据筛选项目配置使用原理主要代码(详细代码可以看我的GitHub仓库)Models.PersonDataGirdViewDataGridViewModel 实现效果 DataGrid直接绑定CollectionViewxamlViewModel 总结 相关链接 十月的寒流 在 WPF 中…...

当Vue项目启动后,通过IP地址方式在相同网络段的其他电脑上无法访问前端页面?
当Vue项目启动后,通过IP地址方式在相同网络段的其他电脑上无法访问前端页面,可能是由以下几个原因造成的: 服务监听地址:默认情况下,许多开发服务器(如Vue CLI的vue-cli-service serve)只监听lo…...
native sql -ABAP开发从入门到精通笔记
Native SQL SQL概要 OPEN SQL读取数据 Select Select <lines> <columns>... Select signle <cols>.... where. 列去重数据 Select distinct <cols>... where... 当取多条数据时,select结果会保存到内表中。 Select ... into...语句的结果不…...
C++完美转发【gpt】
提问:用极其通俗易懂的文字解释C的完美转发 ChatGPT 好的,让我用非常通俗易懂的方式解释一下 C 中的完美转发。 假设你有一个房子(函数),你想把家具(参数)从一个房间(函数&#x…...

C++之类和对象(2)
目录 1.类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 2. 赋值运算符只能重载成类的成员函数不能重载成全局函数 3. 用户没有显式实现时&…...

时间序列分析实战(四):Holt-Winters建模及预测
🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一|统计学|干货分享 擅长Python、Matlab、R等主流编程软件 累计十余项国家级比赛奖项,参与研究经费10w、40w级横向 文…...
Springboot之集成MongoDB无认证与开启认证的配置方式
Springboot之集成MongoDB无认证与开启认证的配置方式 文章目录 Springboot之集成MongoDB无认证与开启认证的配置方式1. application.yml中两种配置方式1. 无认证集成yaml配置2. 有认证集成yaml配置 2. 测试1. 实体类2. 单元测试3. 编写Controller测试 1. application.yml中两种…...

BLEU: a Method for Automatic Evaluation of Machine Translation
文章目录 BLEU: a Method for Automatic Evaluation of Machine Translation背景和意义技术原理考虑 n n n - gram中 n 1 n1 n1 的情况考虑 n n n - gram中 n > 1 n\gt 1 n>1 的情况考虑在文本中的评估初步实验评估和结论统一不同 n n n 值下的评估数值考虑句子长度…...
代码随想录算法训练营|day42
第九章 动态规划 416.分割等和子集代码随想录文章详解 背包类型求解方法0/1背包外循环nums,内循环target,target倒序且target>nums[i]完全背包外循环nums,内循环target,target正序且target>nums[i]组合背包外循环target,内循环nums,target正序且target>nums[i] 416.分…...

vscode与vue/react环境配置
一、下载并安装VScode 安装VScode 官网下载 二、配置node.js环境 安装node.js 官网下载 会自动配置环境变量和安装npm包(npm的作用就是对Node.js依赖的包进行管理),此时可以执行 node -v 和 npm -v 分别查看node和npm的版本号: 配置系统变量 因为在执…...

Vue前端对请假模块——请假开始时间和请假结束时间的校验处理
开发背景:Vueelement组件开发 业务需求:用户提交请假申请单,请假申请的业务逻辑处理 实现:用户选择开始时间需要大于本地时间,不得大于请假结束时间,请假时长根据每日工作时间实现累加计算 页面布局 在前…...
搭建freqtrade量化交易机器人
本文采用python量化机器人框架 freqtrade 开始操作! freqtrade官方文档 官方文档内容过多,请先跟随本文入门阅读,后续深入学习可参考官方文档~ 1. 准备云服务器 docker 环境 这里以云服务器选择 ubuntu 系统开始,先…...

php伪协议 [SWPUCTF 2022 新生赛]ez_ez_php(revenge)
打开题目 题目源代码如下 <?php error_reporting(0); if (isset($_GET[file])) {if ( substr($_GET["file"], 0, 3) "php" ) {echo "Nice!!!";include($_GET["file"]);} else {echo "Hacker!!";} }else {highlight_fi…...

1.1_1 计算机网络的概念、功能、组成和分类
文章目录 1.1_1 计算机网络的概念、功能、组成和分类(一)计算机网络的概念(二)计算机网络的功能(三)计算机网络的组成1.组成部分2.工作方式3.功能组成 (四)计算机网络的分类 总结 1.…...
pytorch中的各种计算
对tensor矩阵的维度变换,加减乘除等是深度学习中的常用操作,本文对一些常用方法进行总结 矩阵乘法 混合矩阵相乘,官网 torch.matmul(input, other, *, outNone) → Tensor这个方法执行矩阵相乘操作,需要第一个矩阵的最后一个维度…...

大数据技术之 Kafka
大数据技术之 Kafka 文章目录 大数据技术之 Kafka第 1 章 Kafka 概述1.1 定义1.2 消息队列1.2.1 传统消息队列的应用场景1.2.2 消息队列的两种模式 1.3 Kafka 基础架构 第 2 章 Kafka 快速入门2.1 安装部署2.1.1 集群规划2.1.2 集群部署2.1.3 集群启停脚本 2.2 Kafka 命令行操作…...

【GB28181】wvp-GB28181-pro部署安装教程(Ubuntu平台)
目录 前言1 安装依赖2 安装MySQL3 安装redis4 编译ZLMediaKit代码及依赖下载编译运行(如果要运行wvp整个项目,这步可以先不执行) 5 编译wvp-pro下载源码(建议从github上下载,gitee上维护有时候不是很同步)编…...

CentOS删除除了最近5个JAR程序外的所有指定Java程序
帮我写一个shell脚本,ps -eo pid,lstart,cmd --sort-start_time | grep "pgz-admin"查到的结果,返回的所有进程PID,第六个之上的,全部kill 当然,你可以创建一个简单的Shell脚本来完成这个任务。以下是一个例…...

面试redis篇-13Redis为什么那么快
Redis是纯内存操作,执行速度非常快采用单线程,避免不必要的上下文切换可竞争条件,多线程还要考虑线程安全问题使用I/O多路复用模型,非阻塞IOI/O多路复用模型 Redis是纯内存操作,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度, I/O多路复用模型主要就是实现了高效…...

python Matplotlib Tkinter--pack 框架案例
环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pillow 10.1.0 版本一 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...