本人最近在研究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事件。
在示例代码中,我们在窗口的构造函数中创建了一个包含几个 Person 对象的 ObservableCollection。然后,我们将该集合设置为 DataGrid 的 ItemsSource,从而将数据绑定到 DataGrid。在实际应用中,我们可以根据需要自定义列样式、添加按钮或其他控件,并处理数据的增删改操作。现在,当我们运行应用程序时,DataGrid 将显示我们定义的列和数据。我们可以在 DataGrid编辑数据,并自动反映到我们的数据集合中。接下来,我们需要定义 DataGrid 的列。 DataGrid默认情况下就支持行内编辑,只不过比较简单,通常是显示用TextBlock,双击编辑时用TextBox,不过DataGrid支持模板自定义,编辑时使用其它控件,这样就可以实现更强大的功能。 <DataGrid x:Name="RecognizeGrid" ItemsSource="{Binding LstRecognizeTable}" SelectionUnit="Cell" KeyUp="RecognizeGrid_KeyUp" attachHelper:DataGridAttach.IsFocused="{Binding RecognizeGridIsFocused,Mode=TwoWay,Upd. 踩坑描述:         我想在RowEditEnding中获取更改后的数据,但是这个RowEditEnding事件是在更改提交前触发的,意味着它获取到更改行的数据源就是旧的。(CellEditEnding也是如此)         也许这个事件适用于应用修改前检测修改是否合法,不合法可以撤销修改,但我想实现的效果是对更改后的数据进行操作的。然后我也找不到有类似于RowEditEnded之类能获取到修改后数据的事件。网上找了好 在这里,`MyData` 是自定义对象的类型,它表示在 DataGrid 中显示的每个单元格中的数据。要更新 DataGrid 中的单元格,请更新 `myDataList` 中的相应属性值。在此示例中,我们将 `myDataList[0].PropertyName` 更新为新值,然后 DataGrid 将自动更新相应的单元格。要更新 WPF DataGrid 的内容,必须先更新其数据源。一旦数据源已更新,则可以调用 DataGrid 的 `ItemsSource` 属性并将其设置为更新的数据源。 编辑DataGrid中的单元格的内容然后保存是非常常用的功能。主要涉及到的方法就是DataGridCellEditEnding  和BeginningEdit 。其中BeginningEdit 是当单元格选中后,状态为可编辑状态时触发。CellEditEnding 是在单元格失去焦点后触发的事件。    对于编辑DataGrid单元格内容的实现逻辑比较简单: 1.保存旧的单元格内容。 让我们尝试一个看起来很像前一章中的示例,但我们手动定义所有列,以实现最大控制。您可以根据要显示/编辑的数据选择列类型。尤其是最后一个DataGridTemplateColumn很有趣。它允许您定义任何类型的内容,这为使用来自 WPF 库甚至您自己或第三方控件的自定义控件提供了机会。set;set;在标记中,我在DataGrid 上添加了AutoGenerateColumns属性,我已将其设置为false,以控制所使用的列。 /获取每一行// 根据每一行获取每一列有了cell对象,我们就可以对每个cell进行设置:比如,设置某些cell不可编辑cell.IsEnabled = false;比如,设置某些cell背景或者前景颜色:cell.Foreground = new SolidColorBrush(Colors.Green);还有一点需要注意的是:这些设置会在表格排序后失效,所以我们一般需要禁用DateGrid的排序功能(将属性 CanUserSortColumns="False")。 在DataGridView中对数据进行修改,先弹出修改界面,显示修改之前的信息,然后在修改页面上,进行修改并更新数据库中 一、点击“修改”,弹出修改界面并在界面上显示所选中行的信息 在页面中点击“修改”,弹出修改页面,并且自动在修改页面中显示出需要修改的行的信息 实现过程: 1.点击“修改”,获取鼠标选中的学生号,并把该值传入新窗体(信息修改界面),新窗体根据 St...