WPF-DataGrid的增删查改

背景:该功能为几乎所有系统开发都需要使用的功能,现提供简单的案例。

1、MyCommand

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;namespace WpfApplication25_DataGrid.ViewModels
{public class MyCommand:ICommand{private readonly Action _execute;private readonly Func<bool> _canExecute;private readonly Action<object> _execute2;public MyCommand(Action execute, Func<bool> canExecute = null){_execute = execute;// throw new ArgumentNullException(nameof(execute));_canExecute = canExecute;}public event EventHandler CanExecuteChanged{add { CommandManager.RequerySuggested += value; }remove { CommandManager.RequerySuggested -= value; }}public bool CanExecute(object parameter){return _canExecute == null || _canExecute();}public void Execute(object parameter){_execute();}}
}

2、Notify

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;namespace WpfApplication25_DataGrid.ViewModels
{public abstract class Notify : INotifyPropertyChanged{public event PropertyChangedEventHandler PropertyChanged;public void OnPropertyChanged([CallerMemberName] string name = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));}}
}

3、数据模型Person

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace WpfApplication25_DataGrid.Models
{public class Person{public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }}
}

4、编辑EditPersonWindow.xaml

<Window x:Class="WpfApplication25_DataGrid.Views.EditPersonWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApplication25_DataGrid.Views"mc:Ignorable="d"Title="EditPersonWindow" Height="200" Width="300"><Grid><StackPanel Orientation="Vertical" Margin="10"><Label Content="姓名:"/><TextBox Text="{Binding Person.Name}" Width="200"/><Label Content="年龄:"/><TextBox Text="{Binding Person.Age}" Width="200"/><StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,10,0,0"><Button Content="保存" Command="{Binding SaveCommand}" Width="80"/><Button Content="取消" Command="{Binding CancelCommand}" Width="80"/></StackPanel></StackPanel></Grid>
</Window>

5、编辑EditPersonWindow.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using WpfApplication25_DataGrid.ViewModels;namespace WpfApplication25_DataGrid.Views
{/// <summary>/// EditPersonWindow.xaml 的交互逻辑/// </summary>public partial class EditPersonWindow : Window{public EditPersonWindow(EditPersonViewModel viewModel){InitializeComponent();this.DataContext = viewModel;}}
}

6、EditPersonViewModel.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using WpfApplication25_DataGrid.Models;namespace WpfApplication25_DataGrid.ViewModels
{public class EditPersonViewModel : Notify{public Person Person { get; set; }public Action<bool?> CloseAction { get; set; }public MyCommand SaveCommand { get; set; }public MyCommand CancelCommand { get; set; }public EditPersonViewModel(Person person){Person = person;SaveCommand = new MyCommand(SavePerson);CancelCommand = new MyCommand(Cancel);}private void SavePerson(){CloseAction?.Invoke(true);}private void Cancel(){CloseAction?.Invoke(false);}}
}

7、MainWindow.xaml

<Window x:Class="WpfApplication25_DataGrid.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApplication25_DataGrid"xmlns:vm="clr-namespace:WpfApplication25_DataGrid.ViewModels"mc:Ignorable="d"Title="MainWindow" Height="350" Width="525"><Grid><DataGrid ItemsSource="{Binding Persons}"SelectedItem="{Binding SelectedPerson}"AutoGenerateColumns="False"HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="200" Width="507"><DataGrid.Columns><DataGridTextColumn Header="ID" Binding="{Binding Id}" /><DataGridTextColumn Header="姓名" Binding="{Binding Name}" /><DataGridTextColumn Header="年龄" Binding="{Binding Age}" /></DataGrid.Columns></DataGrid><StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="10,220,0,0" VerticalAlignment="Top"><Button Content="新增" Command="{Binding AddCommand}" Width="80"/><Button Content="删除" Command="{Binding DeleteCommand}" Width="80"/><Button Content="修改" Command="{Binding UpdateCommand}" Width="80"/><Button Content="搜索" Command="{Binding SearchCommand}" Width="80"/><TextBox Text="{Binding SelectTxt}" Width="100" Margin="10,0,0,0"HorizontalAlignment="Left" VerticalAlignment="Center"/></StackPanel></Grid>
</Window>

8.PersonViewModel.cs

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;using WpfApplication25_DataGrid.Models;
using WpfApplication25_DataGrid.Views;namespace WpfApplication25_DataGrid.ViewModels
{public class PersonViewModel : Notify{public ObservableCollection<Person> Persons { get; set; }public Person SelectedPerson { get; set; }public ICommand AddCommand { get; set; }public ICommand DeleteCommand { get; set; }public ICommand UpdateCommand { get; set; }public ICommand SearchCommand { get; set; }/// <summary>/// 查询字段/// </summary>private string selectTxt = "未登录";public string SelectTxt{get { return selectTxt; }set{selectTxt = value;OnPropertyChanged();}}public PersonViewModel(){Persons = new ObservableCollection<Person>{new Person { Id = 1, Name = "Alice", Age = 25 },new Person { Id = 2, Name = "Bob", Age = 30 },new Person { Id = 3, Name = "Charlie", Age = 35 }};AddCommand = new MyCommand(AddPerson);DeleteCommand = new MyCommand(DeletePerson);UpdateCommand = new MyCommand(UpdatePerson);SearchCommand = new MyCommand(SearchPerson);}/// <summary>/// 增/// </summary>/// <param name="parameter"></param>private void AddPerson(){var newPerson = new Person();var editViewModel = new EditPersonViewModel(newPerson);var editWindow = new EditPersonWindow(editViewModel);editViewModel.CloseAction = (result) =>{editWindow.DialogResult = result;editWindow.Close();};if (editWindow.ShowDialog() == true){newPerson.Id = Persons.Count + 1;Persons.Add(newPerson);}}/// <summary>/// 删/// </summary>/// <param name="parameter"></param>/// <returns></returns>private bool CanDeletePerson(){return SelectedPerson != null;}/// <summary>/// 删除/// </summary>/// <param name="parameter"></param>private void DeletePerson(){if (SelectedPerson != null){var result = MessageBox.Show($"确认要删除 {SelectedPerson.Name} 吗?", "删除确认", MessageBoxButton.YesNo);if (result == MessageBoxResult.Yes){Persons.Remove(SelectedPerson);}}}/// <summary>/// 更新/// </summary>/// <param name="parameter"></param>private void UpdatePerson(){if (SelectedPerson != null){var editViewModel = new EditPersonViewModel(SelectedPerson);var editWindow = new EditPersonWindow(editViewModel);editViewModel.CloseAction = (result) =>{editWindow.DialogResult = result;editWindow.Close();};if (editWindow.ShowDialog() == true){// 因为传递的是引用,修改已在窗口中完成}}}查询private void SearchPerson(){string sss = SelectTxt;if (sss!=""){var searchResult = new ObservableCollection<Person>();foreach (var person in Persons){if (person.Id==Convert.ToInt16(sss)){searchResult.Add(person);}}Persons = searchResult;OnPropertyChanged(nameof(Persons));}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/71990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle数据库存储结构--物理存储结构

数据库存储结构&#xff1a;分为物理存储结构和逻辑存储结构。 物理存储结构&#xff1a;操作系统层面如何组织和管理数据 逻辑存储结构&#xff1a;Oracle数据库内部数据组织和管理数据&#xff0c;数据库管理系统层面如何组织和管理数据 存储结构 在Oracle数据库的存储结构…

歌词相关实现

歌词相关 歌词数据模型&#xff1a; // Lyric.swift class Lyric: BaseModel {/// 是否是精确到字的歌词var isAccurate:Bool false/// 所有的歌词var datum:Array<LyricLine>! }// LyricLine.swift class LyricLine: BaseModel {/// 整行歌词var data:String!/// 开始…

纺织服装制造行业现状 内检实验室系统在纺织服装制造行业的应用

在纺织服装制造行业&#xff0c;内检实验室LIMS系统&#xff08;实验室信息管理系统&#xff09;已成为提升检测效率、优化质量控制和满足行业合规性要求的关键工具。随着行业竞争的加剧和消费者对产品质量要求的提高&#xff0c;纺织服装制造企业需要更加高效、准确的检测流程…

K8s 1.27.1 实战系列(十一)ConfigMap

ConfigMap 是 Kubernetes 中管理非敏感配置的核心资源,通过解耦应用与配置实现灵活性和可维护性。 一、ConfigMap 的核心功能及优势 ​1、配置解耦 将配置文件(如数据库地址、日志级别)与容器镜像分离,支持动态更新而无需重建镜像。 ​2、多形式注入 ​环境变量:将键值…

3分钟复现 Manus 超强开源项目 OpenManus

文章目录 前言什么是 OpenManus构建方式环境准备克隆代码仓库安装依赖配置 LLM API运行 OpenManus 效果演示总结个人简介 前言 近期人工智能领域迎来了一位备受瞩目的新星——Manus。Manus 能够独立执行复杂的现实任务&#xff0c;无需人工干预。由于限制原因大部分人无法体验…

从零开始学机器学习——构建一个推荐web应用

首先给大家介绍一个很好用的学习地址:https://cloudstudio.net/columns 今天,我们终于将分类器这一章节学习完活了,和回归一样,最后一章节用来构建web应用程序,我们会回顾之前所学的知识点,并新增一个web应用用来让模型和用户交互。所以今天的主题是美食推荐。 美食推荐…

【最后203篇系列】014 AI机器人-1

说明 终于开张了&#xff0c;我觉得AI机器人是一件真正正确&#xff0c;具有商业价值的事。 把AI机器人当成一笔生意&#xff0c;我如何做好这笔生意&#xff1f;一端是业务价值&#xff0c;另一端是技术支撑。如何构造高质量的内容和服务&#xff0c;如何确保技术的广度和深度…

【大模型统一集成项目】如何封装多个大模型 API 调用

&#x1f31f; 在这系列文章中&#xff0c;我们将一起探索如何搭建一个支持大模型集成项目 NexLM 的开发过程&#xff0c;从 架构设计 到 代码实战&#xff0c;逐步搭建一个支持 多种大模型&#xff08;GPT-4、DeepSeek 等&#xff09; 的 一站式大模型集成与管理平台&#xff…

AI4CODE】3 Trae 锤一个贪吃蛇的小游戏

【AI4CODE】目录 【AI4CODE】1 Trae CN 锥安装配置与迁移 【AI4CODE】2 Trae 锤一个 To-Do-List 这次还是采用 HTML/CSS/JAVASCRIPT 技术栈 Trae 锤一个贪吃蛇的小游戏。 1 环境准备 创建一个 Snake 的子文件夹&#xff0c;清除以前的会话记录。 2 开始构建 2.1 输入会…

【简答题002】Java变量简答题

博主会经常补充完善这里面问题的答案。希望可以得到大家的一键三连支持&#xff0c;你的鼓励是我坚持下去的最大动力&#xff01;谢谢&#xff01; 001 什么是Java变量&#xff1f; Java变量是用来存储数据并在程序中引用的命名空间。 002 Java变量有哪些类型&#xff1f; J…

从零开发Chrome广告拦截插件:开发、打包到发布全攻略

从零开发Chrome广告拦截插件&#xff1a;开发、打包到发布全攻略 想打造一个属于自己的Chrome插件&#xff0c;既能拦截烦人的广告&#xff0c;又能优雅地发布到Chrome Web Store&#xff1f;别担心&#xff0c;这篇教程将带你从零开始&#xff0c;动手开发一个功能强大且美观…

基于腾讯云高性能HAI-CPU的跨境电商客服助手全链路解析

跨境电商的背景以及痛点 根据Statista数据&#xff0c;2025年全球跨境电商市场规模预计达6.57万亿美元&#xff0c;年增长率保持在12.5% 。随着平台规则趋严&#xff08;如亚马逊封店潮&#xff09;&#xff0c;更多卖家选择自建独立站&#xff0c;2024年独立站占比已达35%。A…

maven的项目构建

常用构建命令 命令说明mvn clean清理编译结果&#xff08;删掉target目录&#xff09;mvn compile编译核心代码&#xff0c;生成target目录mvn test-compile编译测试代码&#xff0c;生成target目录mvn test执行测试方法mvn package打包&#xff0c;生成jar或war文件mvn insta…

定时任务和分布式任务框架

文章目录 一 Spring Task1.@Scheduled注解介绍2 基本用法(1)使用@EnableScheduling修饰启动类(2)创建定时任务的类(3)fixedDelay(4)fixedRate(5)cron3 执行多个任务4 设置异步执行5 @Async使用自定义线程池6 缺点二 xxl-job介绍架构图与其他任务调度平台的比较运行调…

git安装,配置SSH公钥(查看版本、安装路径,更新版本)git常用指令

目录 一、git下载安装 1、下载git 2、安装Git‌&#xff1a; 二、配置SSH公钥 三、查看安装路径、查看版本、更新版本 四、git常用指令 1、仓库初始化与管理 2、配置 3、工作区与暂存区管理 4、提交 5、分支管理 6、远程仓库管理 7、版本控制 8、其他高级操作 一…

[Web]ServletContext域(Application)

简介 Web应用的Application域的实现是通过ServletContext对象实现的。整个Web应用程序的所有资源共享这个域。生命周期与Web应用程序相同&#xff0c;即当前Web应用程序启动时&#xff08;以服务器视角而非访客视角&#xff09;出生&#xff0c;Web应用服务程序关闭时停止。 通…

qt c++ 进程和线程

在Qt C开发中&#xff0c;进程&#xff08;Process&#xff09;和线程&#xff08;Thread&#xff09;是两种不同的并发模型&#xff0c;各有适用场景和实现方式。以下是详细对比和实际开发中的用法总结&#xff1a; 一、进程&#xff08;Process&#xff09; 进程是操作系统资…

【鸿蒙开发】OpenHarmony调测工具hdc使用教程(设备开发者)

00. 目录 文章目录 00. 目录01. OpenHarmony概述02. hdc简介03. hdc获取04. option相关的命令05. 查询设备列表的命令06. 服务进程相关命令07. 网络相关的命令08. 文件相关的命令09. 应用相关的命令10. 调试相关的命令11. 常见问题12. 附录 01. OpenHarmony概述 OpenHarmony是…

手写简易Tomcat核心实现:深入理解Servlet容器原理

目录 一、Tomcat概况 1. tomcat全局图 2.项目结构概览 二、实现步骤详解 2.1 基础工具包&#xff08;com.qcby.util&#xff09; 2.1.1 ResponseUtil&#xff1a;HTTP响应生成工具 2.1.2 SearchClassUtil&#xff1a;类扫描工具 2.1.3 WebServlet&#xff1a;自定义注解…

【Java开发指南 | 第三十四篇】IDEA没有Java Enterprise——解决方法

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 1、新建Java项目2、单击项目名&#xff0c;并连续按两次shift键3、在搜索栏搜索"添加框架支持"4、勾选Web应用程序5、最终界面6、添加Tomcat 1、新建Java项目 2、单击项目名&#xff0c;并连续按两次…