当前位置: 首页 > news >正文

WPF在MVVM架构下使用DataGrid并实现行删除

一、效果演示

二、Model创建

    //User:用于绑定DataGrid控件的数据 private ObservableCollection<User> _users = new ObservableCollection<User>();public ObservableCollection<User> Users{get { return _users; }set { _users = value; }}//SelectedUser:用于存放DataGrid当行选中时的数据private User _selectedUser;public User SelectedUser{get { return _selectedUser; }set{_selectedUser = value;OnPropertyChanged(nameof(SelectedUser));}}}//自定义数据结构
public class User
{public int Id { get; set; }public string Name { get; set; }public DateTime Birthday { get; set; }public int Sex { get; set; }public string School { get; set; }
}

ObservableCollection<T> 是一个特殊的集合类,它继承自 INotifyCollectionChanged 和 INotifyPropertyChanged 接口
当 ObservableCollection<T> 中的项目被添加、删除或替换时,它会触发 CollectionChanged 事件。这个事件可以被绑定的UI元素(如DataGrid, ListView等)捕获,从而自动更新其显示的内容

 三、ViewModel创建

为DataGrid添加数据

 public Page2ViewModel() {
//为Users添加数据for(int i = 0; i < 20; i=i+5){Page2Model.Users.Add(new User() { Id = i, Name = "A Doe", Birthday = new DateTime(1971, 7, 23), Sex = 1, School = "A" });Page2Model.Users.Add(new User() { Id = i+1, Name = "B Doe", Birthday = new DateTime(1974, 1, 17), Sex = 0, School = "B" });Page2Model.Users.Add(new User() { Id = i+2, Name = "C Doe", Birthday = new DateTime(1991, 9, 2), Sex = 1, School = "C" });Page2Model.Users.Add(new User() { Id = i+3, Name = "D Doe", Birthday = new DateTime(1971, 7, 23), Sex = 1, School = "A" });Page2Model.Users.Add(new User() { Id = i+4, Name = "E Doe", Birthday = new DateTime(1974, 1, 17), Sex = 0, School = "B" });}}

按钮操作 

public CommandBase DataAddition
{get => new CommandBase{DoExecte = new Action<object>(CalcDataAddition)};
}
private void CalcDataAddition(object obj)
{Page2Model.Users.Add(new User() { Id = 3, Name = "***", Birthday = new DateTime(1991, 9, 2), Sex = 1, School = "C" });}public CommandBase DataDeletion
{get => new CommandBase{DoExecte = new Action<object>(CalcDataDeletion)};
}
private void CalcDataDeletion(object obj)
{Debug.WriteLine("用户删除按钮按下");User userToRemove = Page2Model.Users.FirstOrDefault(u => u.Id == 1); // 假设你根据Id查找用户  if (userToRemove != null){Page2Model.Users.Remove(userToRemove);}else{Debug.WriteLine("用户未找到");}
}public CommandBase IdQuery
{get => new CommandBase{DoExecte = new Action<object>(CalcIdQuery)};
}
private void CalcIdQuery(object obj)
{//Debug.WriteLine($"Selected User: {Page2Model.SelectedUser.Id}");User userToRemove = Page2Model.Users.FirstOrDefault(u => u.Id == Page2Model.SelectedUser.Id); // 假设你根据Id查找用户  if (userToRemove != null){Page2Model.Users.Remove(userToRemove);}else{Debug.WriteLine("用户未找到");}
}

四、VIew

 <Grid Background="White"><Grid.RowDefinitions><RowDefinition Height="3*" /><RowDefinition Height="1*" /></Grid.RowDefinitions><DataGrid x:Name="dgSimple" AutoGenerateColumns="False"  VerticalAlignment="Top"CanUserSortColumns="False"     Margin="5" IsReadOnly="True"CanUserResizeColumns="False" CanUserResizeRows="False"  SelectionMode="Single"CanUserReorderColumns="False" AlternationCount="2"  RowHeaderWidth="0" CanUserAddRows="False" ItemsSource="{Binding Page2Model.Users}"  SelectedItem="{Binding Page2Model.SelectedUser, Mode=TwoWay}" ><DataGrid.Columns><DataGridTextColumn Header="序号" Width="150"  Binding="{Binding  Id}"/><DataGridTextColumn Header="姓名"   Width="120"  Binding="{Binding Name}"/><DataGridTextColumn Header="生日"  Width="120"  Binding="{Binding Birthday}"/><DataGridTextColumn Header="性别"  Width="130"  Binding="{Binding Sex}"/><DataGridTextColumn Header="学校"  Width="140"  Binding="{Binding School}"/><DataGridTemplateColumn  Header="操作"  Width="140" ><DataGridTemplateColumn.CellTemplate><DataTemplate><StackPanel Orientation="Horizontal"><Button  Content="删除" Height="34"  Command="{Binding DataContext.IdQuery , RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"  CommandParameter="{Binding}" Width="80" FontSize="20"    HorizontalAlignment="Center" VerticalAlignment="Center"></Button></StackPanel></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn></DataGrid.Columns></DataGrid><Grid Grid.Row="1" ><StackPanel Orientation="Horizontal" ><Button  Content="数据添加" Width="150" Height="40" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10 15 0 0" Command="{Binding DataAddition}"/><Button  Content="数据删除" Width="150" Height="40" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10 15 0 0" Command="{Binding DataDeletion}"/><Button  Content="ID查询" Width="150" Height="40" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10 15 0 0" Command="{Binding IdQuery}"/></StackPanel></Grid></Grid>

实现按钮按下就删除行的重点为

SelectedItem="{Binding Page2Model.SelectedUser, Mode=TwoWay}"

当选中行时SelectedUser变量就会更新为选中的行的内容,

User userToRemove = Page2Model.Users.FirstOrDefault(u => u.Id == Page2Model.SelectedUser.Id);  //当ID对上时将会删除
    if (userToRemove != null)
    {
        Page2Model.Users.Remove(userToRemove);
    }
    else
    {
        Debug.WriteLine("用户未找到");
    }

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 广度优先搜索Breadth-First-Search
  • 【基础】Three.js加载纹理贴图、加载外部gltf格式文件
  • Ext JS主要特点有哪些?
  • uniapp+vue3实现小程序和h5解压线上压缩包以及如何访问解压后的视频地址
  • 詳細解析軟路由與代理爬蟲池-okeyproxy
  • C++和OpenGL实现3D游戏编程【连载8】——纹理文字实现与优化
  • 元学习与机器学习
  • 精通推荐算法29:行为序列建模之MIMN— 记忆网络建模长周期行为序列
  • 视频监控系统布局策略:EasyCVR视频汇聚平台构建高效、全面的安全防线
  • ffmpeg音视频开发从入门到精通——ffmpeg日志及目录操作
  • 第143天:内网安全-权限维持自启动映像劫持粘滞键辅助屏保后门WinLogon
  • 探寻 IP 代理地址繁多之因
  • 【WPF】WPF学习之【二】布局学习
  • Spring Boot 部署(jar包)
  • 手机TF卡格式化后数据恢复:方法、挑战与预防措施
  • 【Leetcode】104. 二叉树的最大深度
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Cookie 在前端中的实践
  • CSS 专业技巧
  • CSS实用技巧干货
  • Golang-长连接-状态推送
  • javascript数组去重/查找/插入/删除
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • PHP的Ev教程三(Periodic watcher)
  • Spark学习笔记之相关记录
  • VUE es6技巧写法(持续更新中~~~)
  • 安装python包到指定虚拟环境
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 复习Javascript专题(四):js中的深浅拷贝
  • 简单基于spring的redis配置(单机和集群模式)
  • 讲清楚之javascript作用域
  • 马上搞懂 GeoJSON
  • 前端面试之闭包
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 手写双向链表LinkedList的几个常用功能
  • 通过git安装npm私有模块
  • 学习JavaScript数据结构与算法 — 树
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​zookeeper集群配置与启动
  • #php的pecl工具#
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $jQuery 重写Alert样式方法
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (42)STM32——LCD显示屏实验笔记
  • (C语言)fgets与fputs函数详解
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (学习日记)2024.01.19
  • (一)RocketMQ初步认识
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • .net core docker部署教程和细节问题