Combox使用的一些技巧

    这些天做一个小型的CMS,也就几张表,用WCF+LINQ2SQL+Silverlight这种方式开发的,对最常用的控件如DataGrid,DataForm以及Toolkit里其它一些控件的用法有了一定的了解,同时参照JV9的教程,把Silverlight里的验证机制仔细的学习了一下,前段时间学习的MVVM框架也派上了用场,感觉用MVVM模式后,客户端的代码维护和分层相对简化了不少。

   今天把自己遇到的Combox中问题整理下:

               1

   关于项最简单的方式就是直接的加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并显示在选择框里的,希望可以请教一下更好的方式。

posted @ 2010-10-22 10:12  ringgo  阅读(7803)  评论(2编辑  收藏  举报