关于WPF DataGrid与类数据的绑定
1.数据Binding
1.1 简介
Bingding这个单词读起来真像"绑定" 啊喂,但是它是"键联"、"联结"的意思,(高中化学三价键其中的"键"就是这个单词),用途是"源"和"目标"的绑定,这个源和目标可以是很多东西,比如控件的数据、类成员数据等,Bingding是一种机制,我们使用这个机制,把数据送到我们想送的地方。

图1.1 Binding机制示意图
2 DataGrid的Bingding元素
我们以一张表格为例子

图1.1 Binding机制示意图
这张表格一共有19项,序号、异常参数、异常种类 ,8个是否保留,隶属原因1-8,由于19项太长,故只截图到前4项。其代码前端代码如下:
1 <DataGrid x:Name="cylinderGrid" CanUserAddRows="False" SelectionUnit="Cell" AutoGenerateColumns="False" HeadersVisibility="All"> 2 <DataGrid.Columns> 3 <DataGridTextColumn Header="序号" Binding="{Binding id}" IsReadOnly="True"/> 4 <DataGridTextColumn Header="异常参数" Binding="{Binding AbnormalPara}" IsReadOnly="True"/> 5 <DataGridTextColumn Header="异常种类" Binding="{Binding AnomalyType}" IsReadOnly="True"/> 6 <DataGridCheckBoxColumn Header="是否保留" Binding="{Binding IsSelected1, UpdateSourceTrigger=PropertyChanged}" ElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnStyle}" 7 EditingElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnEditingStyle}"/> 8 <DataGridTextColumn Header="隶属原因1" Binding="{Binding reason1}" IsReadOnly="True"/> 9 <DataGridCheckBoxColumn Header="是否保留" Binding="{Binding IsSelected2, UpdateSourceTrigger=PropertyChanged}" ElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnStyle}" 10 EditingElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnEditingStyle}"/> 11 <DataGridTextColumn Header="隶属原因2" Binding="{Binding reason2}" IsReadOnly="True"/> 12 <DataGridCheckBoxColumn Header="是否保留" Binding="{Binding IsSelected3, UpdateSourceTrigger=PropertyChanged}" ElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnStyle}" 13 EditingElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnEditingStyle}"/> 14 <DataGridTextColumn Header="隶属原因3" Binding="{Binding reason3}" IsReadOnly="True"/> 15 <DataGridCheckBoxColumn Header="是否保留" Binding="{Binding IsSelected4, UpdateSourceTrigger=PropertyChanged}" ElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnStyle}" 16 EditingElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnEditingStyle}"/> 17 <DataGridTextColumn Header="隶属原因4" Binding="{Binding reason4}" IsReadOnly="True"/> 18 <DataGridCheckBoxColumn Header="是否保留" Binding="{Binding IsSelected5, UpdateSourceTrigger=PropertyChanged}" ElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnStyle}" 19 EditingElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnEditingStyle}"/> 20 <DataGridTextColumn Header="隶属原因5" Binding="{Binding reason5}" IsReadOnly="True"/> 21 <DataGridCheckBoxColumn Header="是否保留" Binding="{Binding IsSelected6, UpdateSourceTrigger=PropertyChanged}" ElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnStyle}" 22 EditingElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnEditingStyle}"/> 23 <DataGridTextColumn Header="隶属原因6" Binding="{Binding reason6}" IsReadOnly="True"/> 24 <DataGridCheckBoxColumn Header="是否保留" Binding="{Binding IsSelected7, UpdateSourceTrigger=PropertyChanged}" ElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnStyle}" 25 EditingElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnEditingStyle}"/> 26 <DataGridTextColumn Header="隶属原因7" Binding="{Binding reason7}" IsReadOnly="True"/> 27 <DataGridCheckBoxColumn Header="是否保留" Binding="{Binding IsSelected8, UpdateSourceTrigger=PropertyChanged}" ElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnStyle}" 28 EditingElementStyle="{StaticResource MaterialDesignDataGridCheckBoxColumnEditingStyle}"/> 29 <DataGridTextColumn Header="隶属原因8" Binding="{Binding reason8}" IsReadOnly="True"/> 30 </DataGrid.Columns> 31 </DataGrid>
我们可以看到每一列比如序号列<DataGridTextColumn Header="序号" Binding="{Binding id}" IsReadOnly="True"/>都有类似的Binding="{Binding id}",这个是为该列元素指定数据来源的绑定属性,也就是图1.1的内容
那么源是谁呢,我们可以为之建立一个类,代码如下:
public class FailureGrid
{
private string _id; //声明字段
private string _AbnormalPara; //声明字段
private string _AnomalyType; //声明字段
private bool _IsSelected1; //声明字段
private bool _IsSelected2; //声明字段
private bool _IsSelected3; //声明字段
private bool _IsSelected4; //声明字段
private bool _IsSelected5; //声明字段
private bool _IsSelected6; //声明字段
private bool _IsSelected7; //声明字段
private bool _IsSelected8; //声明字段
private string _reason1; //声明字段
private string _reason2; //声明字段
private string _reason3; //声明字段
private string _reason4; //声明字段
private string _reason5; //声明字段
private string _reason6; //声明字段
private string _reason7; //声明字段
private string _reason8; //声明字段
}
然后在该表格界面上加入代码:
bearing_Flist = new List<FailureGrid>(); //为上文的类建立List实体集合 /// 为该集合加入你想加入的数据 /// bearingGrid.ItemsSource = bearing_Flist;//将该集合绑定到该表中,在表格的代码中为表格指定了名称bearingGrid,我们将表格的元素源绑定为该集合
之后表格就会显示该集合的内容。如下图

这样绑定就完成了
3 DataGrid的Bingding元素,将更新传递回对象成员
其实上文的绑定如果我们实现了会发现,虽然对象的值被显示到了DataGrid控件上,但是当用户修改该控件上的内容时,对象成员并没有被修改,比如用户打勾是否保留的checkBox时候,其对应的对象成员IsTrue值并不会发生改变(1-8都是),那么如何解决这个问题呢。
这个问题实际上要了解Binding机制,这个部分我还需要继续积累,以后做仔细详述,在这里我只写操作方法,不写操作思想。那就是为类成员函数实现INotifyPropertyChanged接口,在接口中利用成员的get set机制中,触发PropertyChanged事件,在事件中指定属性变更时,我们需要的修改。(好晕)代码如下:
public class FailureGrid: INotifyPropertyChanged
{
private string _id; //声明字段
private string _AbnormalPara; //声明字段
private string _AnomalyType; //声明字段
private bool _IsSelected1; //声明字段
private bool _IsSelected2; //声明字段
private bool _IsSelected3; //声明字段
private bool _IsSelected4; //声明字段
private bool _IsSelected5; //声明字段
private bool _IsSelected6; //声明字段
private bool _IsSelected7; //声明字段
private bool _IsSelected8; //声明字段
private string _reason1; //声明字段
private string _reason2; //声明字段
private string _reason3; //声明字段
private string _reason4; //声明字段
private string _reason5; //声明字段
private string _reason6; //声明字段
private string _reason7; //声明字段
private string _reason8; //声明字段
public string faultType { get; set; }
public string id
{
get { return _id; }
set
{
this._id = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("id"));
}
}
}
public string AbnormalPara {
get { return _AbnormalPara; }
set
{
this._AbnormalPara = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("AbnormalPara"));
}
}
}
public string AnomalyType {
get { return _AnomalyType; }
set
{
this._AnomalyType = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("AnomalyType"));
}
}
}
public bool IsSelected1 {
get { return _IsSelected1; }
set
{
this._IsSelected1 = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("IsSelected1"));
}
}
}
public bool IsSelected2
{
get { return _IsSelected2; }
set
{
this._IsSelected2 = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("IsSelected2"));
}
}
}
public bool IsSelected3
{
get { return _IsSelected3; }
set
{
this._IsSelected3 = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("IsSelected3"));
}
}
}
public bool IsSelected4
{
get { return _IsSelected4; }
set
{
this._IsSelected4 = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("IsSelected4"));
}
}
}
public bool IsSelected5
{
get { return _IsSelected5; }
set
{
this._IsSelected5 = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("IsSelected5"));
}
}
}
public bool IsSelected6
{
get { return _IsSelected6; }
set
{
this._IsSelected6 = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("IsSelected6"));
}
}
}
public bool IsSelected7
{
get { return _IsSelected7; }
set
{
this._IsSelected7 = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("IsSelected7"));
}
}
}
public bool IsSelected8
{
get { return _IsSelected8; }
set
{
this._IsSelected8 = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("IsSelected8"));
}
}
}
public string reason1 {
get { return _reason1; }
set
{
this._reason1 = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("reason1"));
}
}
}
public string reason2
{
get { return _reason2; }
set
{
this._reason2 = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("reason2"));
}
}
}
public string reason3
{
get { return _reason3; }
set
{
this._reason3 = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("reason3"));
}
}
}
public string reason4
{
get { return _reason4; }
set
{
this._reason4 = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("reason4"));
}
}
}
public string reason5
{
get { return _reason5; }
set
{
this._reason5 = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("reason5"));
}
}
}
public string reason6
{
get { return _reason6; }
set
{
this._reason6 = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("reason6"));
}
}
}
public string reason7
{
get { return _reason7; }
set
{
this._reason7 = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("reason7"));
}
}
}
public string reason8
{
get { return _reason8; }
set
{
this._reason8 = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("reason8"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
当我们每次修改对象的值的时候,就会触发PropertyChanged事件,该事件会告诉所有绑定的控件,让控件把修改传回对象成员。以上

浙公网安备 33010602011771号