▪ 前言
在 《WPF 之 DataGrid 入门实践一》 中,我们已经初识 DataGrid 控件,也看到了 DataGrid 的样子。接下我们就要学习 DataGrid 最为重要的功能,就是保存修改后的 DataGrid 数据。
▪ 基础代码
在 《WPF 之 DataGrid 入门实践一》 中,我们已经构建显示在 DataGrid 表中的数据,为了适应本章的内容,我们稍微重构了 实践一 中的基础代码。
重构前台 XAML 代码:
# xaml
<DataGrid x:Name="uiStudentTable" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="姓名" Binding="{Binding Name, Mode=TwoWay}" Width="80" IsReadOnly="True"/>
<DataGridTextColumn Header="年龄" Binding="{Binding Age, Mode=TwoWay}" Width="80"/>
<DataGridTextColumn Header="生日" Binding="{Binding Birthday, Mode=TwoWay}"/>
</DataGrid.Columns>
</DataGrid>
增加了 Mode=TwoWay
属性值,表示数据绑定的模式是双向绑定,说白就是 C# 中数据变量值改变时那么UI控件上的值也自动改变,反之亦然。当然也可以不写,因为默认就是 TwoWay
方式。
注意:并不是设置了
Mode=TwoWay
就马上实现双向绑定,这只是其中的一个配置项,还需要在 C# 中实现 INotifyPropertyChanged。
重构后台 C# 代码:
public partial class MainWindow : Window
{
// 成员变量
private List<Student> listStudent = new List<Student>();
/// <summary>
/// 构造函数
/// </summary>
public DataSettingWindow()
{
InitializeComponent();
listStudent.Add(new Student("李毅", "28", "19900402"));
listStudent.Add(new Student("张通", "28", "19900620"));
listStudent.Add(new Student("焕荣", "38", "19800620"));
uiStudentTable.ItemsSource = listStudent;
}
/// <summary>
/// 学生类
/// </summary>
protected class Student
{
// 成员变量
public string Age{ get; set; }
public string Name{ get; set; }
public string Birthday{ get; set; }
//构造函数
public Student( string name, string age, string birthday )
{
this.Age = age;
this.Name = name;
this.Birthday = birthday;
}
}
}
上述代码中新增了 this.listStudent
成员变量,方便后期的数据保存和查看。
▪ 数据保存案例一:基于 INotifyPropertyChanged
在 .NET 平台上,数据绑定是一项令人十分愉快的技术。利用数据绑定能减少很多的逻辑代码,简化控制逻辑。
通常,可以将某个对象的一个属性绑定到一个可视化的控件上,当属性值改变时,控件上的显示数据也随之发生变化。要实现这一功能,只需要为自定义对象实现 INotifyPropertyChanged 接口即可。此接口中定义了 PropertyChanged 事件,我们只需在属性值改变时触发该事件即可.
INotifyPropertyChanged 接口是 WPF/Silverlight 开发中非常重要的接口, 它构成了 ViewModel 的基础。这里我们直接以 INotifyPropertyChanged 来保存 DataGrid 表的数据。
重构 Student
学生类,代码如下:
/// <summary>
/// 学生类
/// </summary>
protected class Student : INotifyPropertyChanged
{
// 接口事件
public event PropertyChangedEventHandler PropertyChanged;
// 成员变量
public string Age{
get{
return this.age;
}
set{
if( this.age == value ) return;
this.age = value; this.Notify("Age");
}
}
private string age;
// 成员变量
public string Name{
get{
return this.name;
}
set{
if( this.name == value ) return;
this.name = value; this.Notify("Name");
}
}
private string name;
// 成员变量
public string Birthday{
get{
return this.birthday;
}
set{
if( this.birthday == value ) return;
this.birthday = value; this.Notify("Birthday");
}
}
private string birthday;
// 构造函数
public Student( string name, string age, string birthday )
{
this.Age = age;
this.Name = name;
this.Birthday = birthday;
}
// 属性通知
public void Notify( string propertyName )
{
if( this.PropertyChanged != null ) this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
很简单,只要稍微改造下 Student
就完工了。运行程序,修改 DataGrid 表中值,对应 C# 中的 this.listStudent
成员变量值也能自动改变。
怎么才能看到
this.listStudent
成员变量的值改变了呢?做一个按钮,然后再按钮的点击事件里设置一个断点,每次想看的时候点击按钮就进入断点,你可以查看断点的变量。