WPF 数据控件绑定数据与 ASP.NET数据控件绑定数据的区别
或许很多新手会发现 WPF中 ComboBox绑定数据时没有办法制定 VALUE,甚至ComboBox里根本就没有这个属性,那么难道我们只能得到选择后的文本或者Content里的东西吗?要对应数据里的关键字列怎么办?
还有,无论是在ListView,还是第三方的DataGrid在绑定数据之后,要获得某行某列的数据似乎也没有办法,因为这些控件里行列的集合并找到对应的方法来获得节点树上的控件对象的值。
做惯了ASP.NET的开发员,突然遇到这样的情况会很迷茫
其实,WPF做得更彻底。
一个小实验
在ComboBox或者ListView里绑定好数据之后,添加一个SelectedIndexChanged事件或其他什么事件,随便。
然后在处理函数里
MessageBox.Show ( DataBindListControl.SelectedItem); //大部分数据绑定控件都有的这个已选项属性
或
MessageBox.Show ( DataBindListControl.SelectedValue.ToString()); //如果数据控件是ComboBox也可以用SelectedValue这个属性
你会发现,弹出来的字符串是你的数据源的项类型,例如数据源是HashTable的话 将看到显示的是这个类型System.Collections.DictionaryEntry类型的字符串
如果是DataView的话,显示的是DataRowView类型的字符串
所以,在WPF里不同于在ASP.NET
WPF直接将数据控件的项直接被绑定成数据源的项,并且连类型都一样。
而ASP.NET中,控件会将数据源的项转换成他自己的ITEM的项,所以,我们在ASP.NET需要通过数据控件的类似ITEM的属性或下级属性来获取其中的每一项的值
而在WPF中,我们在直接获得数据控件的项以后,可以直接转换成数据源的项类型后直接使用。
例如
((DataRowView)DataBindListControl.SelectedItem)["Name"].ToString();
如果你的数据源是一个DataView,这句代码将直接获得被选择的项的Name字段的值,因为这个项其实就是你的数据源的项,所以就得到了被选择的这个项所对因的数据源里的Name字段里的数据。即使Name字段可能没有被绑定显示在数据控件上,但是他是是在存在的,所以并不取决于数据控件是否绑定显示过该字段,而取决于数据源是否有该字段。
另外,提一点,ComboBox控件中设置绑定字段的属性是DisplayMemberPath,值是字符串类型,描述数据路径就可以了
例如 ComboBox.DisplayMemberPath=“Name”;
设置 SelectedValuePath 后可以通过 SelectedValue获得绑定的数据对象的对应字段值,这一点类似WEB的DropDownList,稍微有点区别。
例如 默认绑定值可以这样设置
ComboBox.SelectedValuePath = "Key";
ComboBox.SelectedValue = “03”;
同时需要注意,在未设置SelectedValuePath 的情况下,SelectedValue 和SelectedItem是一样的,如果设置了SelectedValuePath那么SelectedValue就是指定的对象字段了。
ListView等其他控件也同理。
随便,写的不是很规整,纯属记录,加强记忆。