关于WPF DataGrid与类数据的绑定

1.数据Binding

1.1 简介

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

图1.1 Binding机制示意图

2 DataGrid的Bingding元素  

  我们以一张表格为例子

  图2.1 异常原因表

 

 

 图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事件,该事件会告诉所有绑定的控件,让控件把修改传回对象成员。以上

 

posted @ 2023-01-17 20:04  戒不掉的尼古丁  阅读(3034)  评论(0)    收藏  举报