WPF学习笔记——编辑DataGrid单元格并实时更新到数据库

时间:2021-03-02 14:50:44

前言:

本人最近在研究WPF,正处于从Winform过渡的阶段,这也是我和大家分享的第一篇技术文章,如题。(PS:如有不足,希望大家指正)

问题描述

在使用WPF时,常常需要利用DataGrid向用户展现从数据库中提取的数据,并提供编辑功能。在完成对单元格的编辑时,我需要把修改后的数据及时更新到数据源,并且上传到数据库。假设数据源是StuInfo类的泛型集合List<StuInfo>,更改其中某个实体的Name属性,从"张三"更改到"李四",编辑完单元格后,触发DataGrid的事件(如CellEditEnding)执行更新操作: 

public StuInfo EditingStuInfo {get;set;} //正在被编辑的类实体
private void dgStuInfo_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
//e.Row.Item能够获取当前行所关联的数据源,返回类型是object,因此需要显式转换类型
EditingStuInfo = e.Row.Item as StuInfo;
//对数据库执行更新操作
UpdateInfo(EditingStuInfo);
}

而这时候发现,虽然DataGrid中的数据已经更改,但是数据库中的数据却没有变化。于是我开始调试跟踪,发现在事件CellEditEnding中,EditingStuInfo中Name属性的值依然是"张三",而执行完事件CellEditEnding之后,Name的值则变为"李四",原来数据源的值要执行完该事件后才会被更新,因此在这个事件中执行UpdateInfo方法,数据库的值依然没变化。

因此,我们需要在该事件执行前,就要让数据源得到更新。

解决方法

在Xaml文件中,当进行数据绑定时,更改DataGrid中相应列的UpdateSourceTriggerPropertyChanged

<DataGridTextColumn Header="姓名" Binding="{Binding Name,UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>

这里你可能会担心用户输入非法数据的问题,很幸运DataGrid会根据数据源的类型对用户输入的数据进行验证,当捕获非法数值时,会拒绝这个非法数据,因此就不会触发CellEditEnding事件。