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

news2024/11/24 0:09:55

一、效果演示

二、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("用户未找到");
    }

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

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

相关文章

day43|打家劫舍系列 198.打家劫舍 213. 打家劫舍 II 337.打家劫舍 III

文章目录 前言198.打家劫舍思路方法一213. 打家劫舍 II思路方法一337.打家劫舍 III思路方法一方法二 暴力搜索和记忆化递推总结前言 198.打家劫舍 思路 非常直接的思路 dp五部曲 dp极其下标含义:**考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。**考虑的意思是…

IP地址安全与隐私保护

在当今数字化时代&#xff0c;IP地址作为网络设备的唯一身份标识&#xff0c;在网络安全与隐私保护中扮演着至关重要的角色。然而&#xff0c;随着网络技术的飞速发展&#xff0c;IP地址也面临着诸多挑战&#xff0c;对用户的隐私和网络安全构成了潜在威胁。本文将对IP地址在网…

JAVA基础:封装、继承和多态(详讲)

1 封装 面向对象的三大特征 &#xff1a; 封装&#xff0c; 继承&#xff0c; 多态 。 封装可以从三个层面理解 将属性和方法组合在一起&#xff08;封闭在一起&#xff09; 将属性隐藏起来&#xff0c; 对外提供可以间接操作属性的方法。&#xff08;提高程序设计安全性&…

CephFS使用

CephFS使用 一、CephFS架构二、部署CepfFS服务1、部署MDS服务2、创建CephFS metadata和data存储池3、创建cephFS并验证4、创建客户端账户5、安装ceph客户端并同步认证文件6、内核空间挂载ceph-fs6.1 客户端通过key文件挂载6.2 开机自动挂载 7、客户端模块挂载7.1 用户空间挂载c…

​​​​​​​《黑神话:悟空》—— 高科技点亮西游神话璀璨之路

《黑神话&#xff1a;悟空》作为一款以中国神话为背景的西游题材单机游戏&#xff0c;自诞生起便备受瞩目。它以中国古典名著《西游记》为蓝本&#xff0c;文化内涵深厚&#xff0c;承载着无数国人的童年回忆和文化情感。凭借高科技打造出美轮美奂的画面——细腻逼真的环境场景…

代理服务器详解(proxy server)

什么是代理服务器 (proxy server) 代理服务器&#xff08;Proxy Server&#xff09;是一个中间服务器&#xff0c;位于客户端和目标服务器之间。它代表客户端向目标服务器发送请求&#xff0c;并将目标服务器的响应返回给客户端&#xff0c;其模型如下图所示&#xff1a; 客户…

2024年“羊城杯”粤港澳大湾区网络安全大赛Misc 部分解析

2024年“羊城杯”粤港澳大湾区网络安全大赛Misc 部分解析 前言&#xff1a;数据安全&#xff1a;不一样的数据库_2&#xff1a;Misc - hiden&#xff1a;Misc - miaoro&#xff1a; 前言&#xff1a; 本次 解析是后期复现 当时没时间打 用于交流学习&#xff0c;感谢支持&…

代码随想录算法训练营第三十二天(动态规划 一)

前几天有点忙加上贪心后面好难QWQ 暂时跳过两天的贪心&#xff0c;开始学动归 动态规划理论基础: 文章链接:代码随想录 文章思维导图: 文章摘要: 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&…

运动耳机哪个牌子的好?五大口碑爆棚的骨传导运动耳机全方位分析

随着健康意识的提高和运动文化的普及&#xff0c;越来越多的人开始注重运动时的舒适度和体验感。在众多运动装备中&#xff0c;耳机作为不可或缺的一部分&#xff0c;其选择对运动体验有着直接的影响。传统的入耳式耳机在运动时可能会因为汗水、滑落等问题影响使用体验&#xf…

‘聊天不要太正经,越调戏对方越爱你的搞笑句子’

01 02 03 04 05 06 07 免费小程序《字形绘梦》上线啦&#xff01; 欢迎大家体验&#xff01;

自动驾驶技术软件教学平台

1、基本介绍 自动驾驶技术软件教学平台是中智讯公司开发的一款面向人工智能相关专业自动驾驶方向的综合型实验平台&#xff0c;主要满足&#xff1a;机器人控制技术、机器人操作系统、机器视觉技术、机器语言技术、智能边缘计算、人工智能中间件、机器人协作、SLAM导航等课程的…

餐饮行业的数字化转型——霸王餐API接口对接

霸王餐API接口对接对餐饮行业的数字化转型具有显著的推动作用&#xff0c;其关键优势和特点包括&#xff1a; 提升运营效率&#xff1a;通过自动化管理&#xff0c;减少人工操作&#xff0c;提高工作效率和减少错误。优化消费者体验&#xff1a;提供实时的菜品信息、下单和支付…

《软件工程导论》(第6版)第9章 面向对象方法学引论 复习笔记

第9章 面向对象方法学引论 一、面向对象方法学概述 1&#xff0e;要点 面向对象方法学已经成为人们在开发软件时首选的范型。面向对象技术已成为当前最好的软件开发技术。 &#xff08;1&#xff09;基本原则 面向对象方法学的出发点和基本原则&#xff0c;是尽可能模拟人…

NPDP|如何在传统行业中做好产品管理的策略与建议

在当今这个快速变化的数字时代&#xff0c;传统行业面临着前所未有的挑战与机遇。产品管理作为连接市场需求与企业生产的核心环节&#xff0c;其重要性不言而喻。对于传统行业而言&#xff0c;做好产品管理不仅意味着保持竞争力&#xff0c;更是实现转型升级、拥抱未来的关键。…

MATLAB进行天线阵列方向图综合

摘要&#xff1a;本次推文将介绍如何利用MATLAB的Sensor Array Analyzer进行天线阵列的方向图综合。 1. 阵列方向图综合理论 对于均匀平面阵列而言&#xff0c;其阵因子公式可以写成 当阵列是三角网格布置或者圆环阵时&#xff0c;《ANTENNA THEORY ANALYSIS AND DESIGN》等相…

前端跨域问题详解与解决方案指南

什么是跨域问题 跨域问题通常是由浏览器的同源策略&#xff08;Same-OriginPolicy&#xff0c;SOP&#xff09;引起的访问问题 同源策略是浏览器的一个重要安全机制&#xff0c;它用于限制一个来源的文档或脚本如何能够与另一个来源的资源进行交互 同源策略的定义 同源策略要…

【MySQL_JDBC】Day23-Day28 数据库基础、JDBC基础、聊天室3.0

数据库 数据库基本概念 数据库DataBase 定义: 保存数据的仓库就称为数据库 例如 编写一个用户管理系统&#xff0c;可以让用户在我们编写的系统上进行注册等操作&#xff0c;此时就涉及到了保存用户数据的操作&#xff0c;目前我们的做法可以将一个用户信息以一个User对象…

【精选】大型体育场管理系统的设计与实现(全网最新定制,独一无二)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Unity(2022.3.41LTS) - UI详细介绍-Dropdown(下拉列表)

目录 零.简介 一、基本功能与用途 二、组件介绍 三、使用方法 四、优化和注意事项 五.代码实例 零.简介 在 Unity 中&#xff0c;下拉列表&#xff08;Dropdown&#xff09;是一种常用的 UI 组件&#xff0c;用于提供一组选项供用户选择。 一、基本功能与用途 选项选择…

【出行计划 / 2】

题目 思路 暴力 O ( m ⋅ n ) O(m \cdot n) O(m⋅n) \;\;\;\;\; 不可行 树状数组差分 O ( m ⋅ l o g ( 5 e 5 ) ) O(m \cdot log(5e^{5})) O(m⋅log(5e5)) \;\;\;\;\; 可行 具体思路&#xff1a; t [ i ] ∈ [ q k − c [ i ] 1 , q k ] t[i] \in [qk-c[i]1, \;qk…