这些天做一个小型的CMS,也就几张表,用WCF+LINQ2SQL+Silverlight这种方式开发的,对最常用的控件如DataGrid,DataForm以及Toolkit里其它一些控件的用法有了一定的了解,同时参照JV9的教程,把Silverlight里的验证机制仔细的学习了一下,前段时间学习的MVVM框架也派上了用场,感觉用MVVM模式后,客户端的代码维护和分层相对简化了不少。
今天把自己遇到的Combox中问题整理下:
关于项最简单的方式就是直接的加ComboxItem
ComboBoxItem item = new ComboBoxItem() {Content="财务部",IsSelected=true };
this.comboBox.Items.Add(item);
用绑定数据源的方式则主要就是一个DisplayMemberPath属性,
<ComboBox DisplayMemberPath="name" ItemsSource="{Binding}"/>如果数据源是一个Department集合,那么每一个Item都是一个Department,这样的情况下,只能通过
int deptCode = (this.comboBox.SelectedItem as Departmentt).deptCode;
这种方式来获取数据的Value,不过网上有人扩展了SelectValuePath的依赖属性,具体的查看这篇文章ComboBox,通过这种方式只要绑定到SelectValuePath就可以了
<ComboBox DisplayMemberPath="name" SelectedValuePath="deptCode" ItemsSource="{Binding}"/>
int deptId = this.cmBox.SelectedValue;
后台直接用这个SelectValue就可以了,比上面的方式方便多了。
在Sliverlight中,用绑定方式可能与直接的硬编码方式产生的效果不一样:
ComboBox绑定数据时,无法将传给它的值设为默认值,我尝试了多种方式也没效果,最后只好采取折衷的办法,
<combo:ComboBoxClassic x:Name="cmBox" DropDownOpened="cmBox_DropDownOpened"/>
当传一个值为“01,财务部”给ChildWindow中的ComboBox时,我需要将这个值显示在ComboBox上,可以这样做
this.child.cmBox.Items.Add(new ComboBoxItem { Content=dept.Name,IsSelected=true,Tag=deptId});
这种方式能够保证传过去的值显示在ComboBox中,因为我们是绑定数据源的,所以当用户更改ComboBox内容时可以在DropDownOpen事件里加载记录
if (this.cmBox.Items.Count == 1)
{
this.cmBox.Items.Clear();
}
this.cmBox.ItemsSource = null;
this.cmBox.DisplayMemberPath = "name";
this.cmBox.SelectedValuePath = "deptId";
this.cmBox.ItemsSource =...
这种方式很讨巧,其实如果用户更改ComboBox内容较频繁时,可以把数据源放在独立存储中,这样每次发生DropDownOpened事件时就不用从服务器获取数据
不过我感觉这终究不是好的方式,不知道别人是怎么传值给ComboBox并显示在选择框里的,希望可以请教一下更好的方式。