无论在Winform、WPF、ASP.NET中,数据绑定是我们经常使用的一个重要技术,我们经常会把相关类动态显示绑定到UI界面中,其中有几个比较重要的属性需要大家灵活运用。
那Combox来说明有两个属性DisplayMemberPath和SelectedValuePath,前者是显示控件中每个元素Item的属性,即你想把类中的哪个属性显示出来,就用这个关键字DisplayMemberPath,而SelectedValuePath表示在combox中选中Item的值是类中的哪个属性,即每个Item的SelectedValue的值,比如一个学生类
class student
{
public int id;
public string name;
}
一般情况下ComboBox.Itemsource=StudentList设置完之后,再设置ComboBox.DisplayMemberPath="name";ComboBox.SelectedValuePath="id";
这样每个combobox的item的value就是id,但它显示出来的是name,当然类似的ListBox等也可以运用这些属性。
现在那我写过的一个小项目说明一个比较复杂的绑定,项目中有两个类Employee、Department,我们知道每位员工都有他所属的部门,没个部门都有若干的员工。
在项目中我们通过一些特定的条件进行搜索将搜索出来的Employee绑定到一个DataGrid上,我的意思是说想通过Employee表中的DepartmentId这个表示列,从Department表中查询并返回Name属性显示到DataGrid的列上去。
Employee:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace HR.Model 8 { 9 public class Employee 10 { 11 public Guid Id 12 { 13 get; 14 set; 15 } 16 17 /// <summary> 18 /// 部门Id 19 /// </summary> 20 public Guid DepartmentId 21 { 22 get; 23 set; 24 } 25 26 //剩下的暂不需要看 27 28 /// <summary> 29 /// 工号 30 /// </summary> 31 public string Number 32 { 33 get; 34 set; 35 } 36 37 public string Name 38 { 39 get; 40 set; 41 } 42 43 /// <summary> 44 /// 性别Id 45 /// </summary> 46 public Guid GenderId 47 { 48 get; 49 set; 50 } 51 52 //因为图片如果一次性读取到Model中会非常耗内存,因此需要的时候再去单独读取,不在Model中建字段 53 54 /// <summary> 55 /// 出生日期 56 /// </summary> 57 public DateTime BirthDay 58 { 59 get; 60 set; 61 } 62 63 /// <summary> 64 /// 入职日期 65 /// </summary> 66 public DateTime InDate 67 { 68 get; 69 set; 70 } 71 72 /// <summary> 73 /// 婚姻状态Id 74 /// </summary> 75 public Guid MarriageId 76 { 77 get; 78 set; 79 } 80 81 /// <summary> 82 /// 政治面貌Id 83 /// </summary> 84 public Guid PartyStatusId 85 { 86 get; 87 set; 88 } 89 90 /// <summary> 91 /// 民族 92 /// </summary> 93 public string Nationality 94 { 95 get; 96 set; 97 } 98 99 /// <summary> 100 /// 籍贯 101 /// </summary> 102 public string NativeAddr 103 { 104 get; 105 set; 106 } 107 108 /// <summary> 109 /// 教育程度Id 110 /// </summary> 111 public Guid EducationId 112 { 113 get; 114 set; 115 } 116 117 /// <summary> 118 /// 专业 119 /// </summary> 120 public string Major 121 { 122 get; 123 set; 124 } 125 126 /// <summary> 127 /// 毕业院校 128 /// </summary> 129 public string School 130 { 131 get; 132 set; 133 } 134 135 /// <summary> 136 /// 地址 137 /// </summary> 138 public string Address 139 { 140 get; 141 set; 142 } 143 144 /// <summary> 145 /// 基本工资 146 /// </summary> 147 public int BaseSalary 148 { 149 get; 150 set; 151 } 152 153 /// <summary> 154 /// Email 155 /// </summary> 156 public string Email 157 { 158 get; 159 set; 160 } 161 162 /// <summary> 163 /// 有效身份证号 164 /// </summary> 165 public string IdNum 166 { 167 get; 168 set; 169 } 170 171 /// <summary> 172 /// 联系电话 173 /// </summary> 174 public string TelNum 175 { 176 get; 177 set; 178 } 179 180 /// <summary> 181 /// 紧急联系人信息 182 /// </summary> 183 public string EmergencyContact 184 { 185 get; 186 set; 187 } 188 189 190 /// <summary> 191 /// 职位 192 /// </summary> 193 public string Position 194 { 195 get; 196 set; 197 } 198 199 /// <summary> 200 /// 合同起始时间 201 /// </summary> 202 public DateTime ContractStartDay 203 { 204 get; 205 set; 206 } 207 208 /// <summary> 209 /// 合同到期时间 210 /// </summary> 211 public DateTime ContractEndDay 212 { 213 get; 214 set; 215 } 216 217 /// <summary> 218 /// 简历 219 /// </summary> 220 public string Resume 221 { 222 get; 223 set; 224 } 225 226 /// <summary> 227 /// 备注 228 /// </summary> 229 public string Remarks 230 { 231 get; 232 set; 233 } 234 235 public byte[] Photo 236 { 237 get; 238 set; 239 } 240 } 241 }
Department类:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace HR.Model 8 { 9 public class Department 10 { 11 public Guid Id 12 { 13 get; 14 set; 15 } 16 17 public string Name 18 { 19 get; 20 set; 21 } 22 } 23 }
UI界面:
在UI界面中的代码:
1 <DataGridComboBoxColumn Header="部门" Width="100" SelectedValueBinding="{Binding DepartmentId}" SelectedValuePath="Id" 2 DisplayMemberPath="Name" x:Name="columnDepartmentId"></DataGridComboBoxColumn>
这块是将DataGrid的某一个数据列(ComboxColumn类型的列),普通的DataTextColum无法完成负责的绑定。
将SelectedValueBinding绑定到DepartmentId,因为我们通过搜索返回的是Employee类型,而Employee对象中有DepartmentId属性,然后SelectedValuePath=Id表示我们是通过Id这个关键字进行搜索,搜索Department中的Id属性,然后以Name属性进行显示。
我们在窗体的Window_Loaded方法中初始化控件,把所有数据库中的Department对象绑定到控件DataGrid中的ComboxColumn中。
后台代码:
然后通过点击搜索按钮的点击事件对DataGrid控件进行再次绑定。
后台代码:
大家只看最后一句就行,即通过点击把一些搜索条件记录下来,然后进行Sql select操作,然后返回特定的Employee对象。