首页 > 其他分享 >WPF 使用ICollectionView过滤表格数据

WPF 使用ICollectionView过滤表格数据

时间:2024-07-23 18:18:54浏览次数:11  
标签:RuleFor set string 表格 get ICollectionView 视图 WPF public

ICollectionView接口

是一个用于提供数据视图的类,它允许你对数据进行排序、筛选和分组。可以通过静态方法CollectionViewSource.GetDefaultView(object)获取。

MSDN接口说明:https://learn.microsoft.com/zh-cn/dotnet/api/system.componentmodel.icollectionview?view=windowsdesktop-8.0

代码演示

MVVM框架使用CommunityToolkit.MVVM,UI界面框架使用MaterialDesignThemes,生成测试数据使用Bogus

View代码为:

<Window
    x:Class="WPFTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:be="http://schemas.microsoft.com/xaml/behaviors"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WPFTest"
    xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
 <Grid>
 <Grid.RowDefinitions>
 <RowDefinition Height="auto"  />
 <RowDefinition Height="*"  />
 </Grid.RowDefinitions>
 <TextBox
            Grid.Row="0"
            Margin="5"
            Text="{Binding SearchContent, UpdateSourceTrigger=PropertyChanged}"  />
 <DataGrid
            x:Name="DataGrid"
            Grid.Row="1"
            Margin="5"
            materialDesign:DataGridAssist.CellPadding="4 2 2 2"
            materialDesign:DataGridAssist.ColumnHeaderPadding="4 2 2 2"
            AutoGenerateColumns="True"
            Background="White"
            GridLinesVisibility="All"
            HorizontalScrollBarVisibility="Visible"
            IsReadOnly="True"
            ItemsSource="{Binding CollectionView}"
            SelectionMode="Single"
            VerticalScrollBarVisibility="Visible">
 </DataGrid>
 </Grid>
</Window>

ViewModel部分代码为:

using CommunityToolkit.Mvvm.ComponentModel;
using Bogus;
using System.ComponentModel;
using System.Windows.Data;
  
namespace WPFTest
{
 public  class MainViewModel : ObservableRecipient
    {
 private List<DataModel> list = new List<DataModel>();
  
        //数据表格显示内容,动态加载不同类型的内容
 private ICollectionView collectionView;
  
 public ICollectionView CollectionView
        {
 get => collectionView;
 set => SetProperty(ref collectionView, value);
        }
  
        //搜索内容
 private  string searchContent = string.Empty;
  
 public  string SearchContent
        {
 get => searchContent;
 set
            {
                if (SetProperty(ref searchContent, value))
                {
                    CollectionView.Refresh();
                }
            }
        }
  
        public MainViewModel()
        {
            InitTestData();
            CollectionView = CollectionViewSource.GetDefaultView(list);
CollectionView.Filter = new Predicate<object>(OnFilterMovie);
        }
  
/// <summary>
        /// 过滤方法
/// </summary>
/// <param  name="item"></param>
/// <returns></returns>
private bool OnFilterMovie(object item)
        {
 if (string.IsNullOrEmpty(SearchContent) || item == null || list == null || list.Count <= 0)
            {
 return  true;
            }
 else
            {
DataModel model = item as DataModel;
 return model.Name.IndexOf(SearchContent, StringComparison.InvariantCultureIgnoreCase) >= 0;
            }
        }
  
private void InitTestData()
        {
            list.Clear();
Randomizer.Seed = new Random(123456);
 var customerGenerator = new Faker<DataModel>()
                .RuleFor(c => c.Id, Guid.NewGuid())
                .RuleFor(c => c.Name, f => f.Company.CompanyName())
                .RuleFor(c => c.Address, f => f.Address.FullAddress())
                .RuleFor(c => c.City, f => f.Address.City())
                .RuleFor(c => c.Country, f => f.Address.Country())
                .RuleFor(c => c.ZipCode, f => f.Address.ZipCode())
                .RuleFor(c => c.Phone, f => f.Phone.PhoneNumber())
                .RuleFor(c => c.Email, f => f.Internet.Email());
            list = customerGenerator.Generate(100);
        }
    }
}

Model代码为:

namespace WPFTest
{
 public  class DataModel
    {
 public Guid Id { get; set; } =  new Guid();
 public  string Name { get; set; } =  string.Empty;
 public  string Address { get; set; } =  string.Empty;
 public  string City { get; set; } =  string.Empty;
 public  string Country { get; set; } =  string.Empty;
 public  string ZipCode { get; set; } =  string.Empty;
 public  string Phone { get; set; } =  string.Empty;
 public  string Email { get; set; } =  string.Empty;
    }
}

示例程序界面由文本框和表格组成,文本框过滤名称,后台绑定数据一发生变化则刷新CollectionView更新界面,表格实际绑定为CollectionView,数据部分可以直接用List而不用ObservableCollection,过滤方法为

CollectionView.Filter =  new Predicate<object>(OnFilterMovie);

将过滤逻辑OnFilterMovie绑定至Filter上,在OnFilterMovie中判断实际的返回结果

运行效果如下:


回顾

CollectionView就是一个视图类,它的实例代表了一个视图类实例,视图可以用来做集合对象显示的相关操作(分组,排序,过滤,导航等)。视图的优点有:对视图的分组,过滤等等操作不会影响到源集合本身;一个集合可以有多个不同的视图,源集合的改变有能力通知到它所有的视图(前提是源集合实现了INotifyCollectionChanged接口)。

标签:RuleFor,set,string,表格,get,ICollectionView,视图,WPF,public
From: https://www.cnblogs.com/SmallCarp/p/18319260

相关文章

  • vue element-ui表格table 表格动态 添加行、删除行、添加列、删除列 自定义表头
       vuetable表格动态添加行、删除行、添加列、删除列自定义表头; 增加一行、删除一行、添加一列、删除一列;每行带输入框input代码1、HTML部分:<template><divclass="app-container"><el-table:data="tableData"borderstyle="width:600px;margin-top:2......
  • R语言基于表格文件的数据绘制具有多个系列的柱状图与直方图
      本文介绍基于R语言中的readxl包与ggplot2包,读取Excel表格文件数据,并绘制具有多个系列的柱状图、条形图的方法。  首先,我们配置一下所需用到的R语言readxl包与ggplot2包;其中,readxl包是用来读取Excel表格文件数据的,而ggplot2包则是用以绘制柱状图的。包的下载方法也非常简单,......
  • 爱思唯尔模板 LATEX 表格标题左对齐
    爱思唯尔模板LATEX表格标题左对齐1.问题描述2.解决方法1.问题描述若出现表格标题如下居中形式,想要变成左对齐的形式。2.解决方法在\begin{document}前面加上\usepackage[font=small,labelfont=bf,labelsep=none]{caption}\captionsetup[table]{labelforma......
  • 解决Element UI 表格组件懒加载数据刷新问题
    一、问题描述elementui的table组件设置成懒加载时,遇到数据表格需要更新、删除等操作,子节点不会自动更新。二、解决思路刷新数据,就是重新调用load(),通过map记录已展开的节点,需要刷新数据时,取出对应treeNode,调用load()进行数据刷新。三、代码实现(VUE)exportdefault{data(......
  • xlsx 前端插件 导出 elment表格示例
    安装yarnaddxlsxyarnaddfile-savergit文档:https://github.com/rockboom/SheetJS-docs-zh-CNnpm地址:https://www.npmjs.com/package/xlsx代码<template> <divclass='box'> pageC <el-buttontype="primary"size="defa......
  • 在考虑表格条件后,在空间上溶解相交的线
    在参加一些表格条件后,我需要溶解来自ageodataframe的所有彼此相交的线串:1)具有相同的ID和2)具有相同的opening年份。这些数据代表道路数据库,我正在使用geopandas数据如下所示:idopeninggeometry0302020LINESTRI......
  • 智能图片识别表格
    文章目录在线体验快速开始一、项目介绍篇1.1PP-Structure概述1.2PP-Structure核心功能:表格识别1.3PP-Structure特点1.4模块介绍1.4.1TableDec.py1.4.2app.py二、核心代码介绍篇2.1app.py2.2TableDec.py2.3扩展-模型选择3.4.1版面分析模型3.4.2表格识别模型......
  • WEB前端08-综合案例(动态表格)
    使用HTML、CSS和JavaScript创建动态表格在本教程中,我们将创建一个动态表格,允许用户添加行、选择项目,并执行批量操作,如全选或删除选中的行。我们将通过HTML、CSS和JavaScript来实现这一功能。让我们逐步了解每个部分是如何协同工作的。HTML结构我们的HTML文档......
  • Python按条件筛选、剔除表格数据并绘制剔除前后的直方图
      本文介绍基于Python语言,读取Excel表格文件数据,以其中某一列数据的值为标准,对于这一列数据处于指定范围的所有行,再用其他几列数据的数值,加以数据筛选与剔除;同时,对筛选前、后的数据分别绘制若干直方图,并将结果数据导出保存为一个新的Excel表格文件的方法。  首先,我们来明确一......
  • Simple WPF: S3实现MINIO大文件上传并显示上传进度
    SimpleWPF:S3实现MINIO大文件上传并显示上传进度 合集-SimpleWPF(9) 1.SimpleWPF:WPF透明窗体和鼠标事件穿透07-012.SimpleWPF:WPF自定义按钮外形07-073.SimpleWPF:WPF实现按钮的长按,短按功能07-084.SimpleWPF:WPF自定义一个可以定义步长的SpinBox07-095.Si......