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

前言:

本人最近在研究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事件。

  • 14
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在 WPF DataGrid编辑单元格,可以使用以下步骤: 1. 将 DataGrid 的属性 `IsReadOnly` 设置为 `False`,这样就可以允许用户编辑单元格。 2. 在 XAML 中,使用 DataGridTemplateColumn 模板列来定义一个可以编辑单元格。例如: ```xml <DataGridTemplateColumn Header="Name"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Name}" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> <DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" /> </DataTemplate> </DataGridTemplateColumn.CellEditingTemplate> </DataGridTemplateColumn> ``` 上述代码中,我们定义了一个 DataGridTemplateColumn 列,其中包含一个 CellTemplate 和一个 CellEditingTemplate。CellTemplate 用于显示单元格的值,而 CellEditingTemplate 用于编辑单元格的值。在这个例子中,我们显示了一个 TextBlock 来显示单元格的值,并且在编辑模式下使用了一个 TextBox 来允许用户编辑单元格的值。 3. 在 ViewModel 中实现 INotifyPropertyChanged 接口,并确保属性的 setter 中调用 PropertyChanged 事件。这是为了确保在单元格编辑时能够正确地更新数据源。 ```csharp public class PersonViewModel : INotifyPropertyChanged { private string _name; public string Name { get { return _name; } set { if (_name != value) { _name = value; OnPropertyChanged("Name"); } } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ``` 上述代码中,我们实现了一个 PersonViewModel,它包含一个 Name 属性,并且当 Name 属性发生变化时会触发 PropertyChanged 事件。 4. 在 DataGrid 的 ItemsSource 中绑定数据源,并确保每个单元格的 DataContext 都是一个 ViewModel 实例。这样,在编辑单元格时,WPF 就会自动更新 ViewModel 中的属性,并且在更新后重新绑定单元格的值。 ```xml <DataGrid ItemsSource="{Binding People}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTemplateColumn Header="Name" Width="*"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Name}" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> <DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" /> </DataTemplate> </DataGridTemplateColumn.CellEditingTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> ``` 上述代码中,我们绑定了一个名为 People 的集合到 DataGrid 的 ItemsSource 属性,并且在 CellTemplate 和 CellEditingTemplate 中使用了 Name 属性来绑定单元格的值。注意,在编辑单元格时,我们使用了 UpdateSourceTrigger=PropertyChanged,这样在用户输入时可以立即更新数据源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值