Silverlight4.0(4) 之 ComboBox


今天花了点儿时间看了一下Silverlight里的一些控件,发现Silverlight中的ComboBox和C#.Net中的Dropdownlist很像,但是语法和属性却有着很大程度的区别,于是决定把这个困扰了我一个多小时的控件写一写

做过C#.Net的人们应该对DropDownList不陌生,或者说是很熟悉(本人就非常喜欢这个控件),它的AutoPostback属性解决了java里不能瞬时联动的问题(JavaWeb中项做瞬刷级联必须配合js来实现),并且在绑定数据源上也给了我们很多惊喜,但是今天看到Silverlight中的ComboBox感觉很失落,虽然它在Dropdownlist的基础上做了一些改进,但是用管了DropDownlist的程序员在初探ComboBox这个控件的时候会感觉很陌生,接下来就用代码说话吧...

MainPage.xaml

MainPage.xaml
 <Grid x:Name="LayoutRoot" Loaded="LayoutRoot_Loaded">
<ComboBox x:Name="DropDownList1" Width="128" Height="24" SelectionChanged="DropDownList1_SelectionChanged"></ComboBox>
<!-- DropDownList1_SelectionChanged:数据发生改变时触发事件 -->
</Grid>

MainPage.xaml.cs

MianPage.xaml.cs
 private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
{
Load_Drop();
DataDrop();
}
#region 加载ComboBox数据
/// <summary>
/// 加载ComboBox数据
/// </summary>
public void Load_Drop()
{
List
<Model.Person> list = new List<Model.Person>(); //创建一个泛型List用于存储实体类对象
for (int i = 0; i < 10; i++) //写一个循环用来增加数据
{
Model.Person ps
= new Model.Person(); //Person实体类
ps.ID = i;
ps.Name
= "Terry" + i;
ps.Age
= "abc" + i;
list.Add(ps);
}
if (list.Count > 0)
{
DropDownList1.ItemsSource
= list; //指定数据源
DropDownList1.DisplayMemberPath = "Name"; //指定ComboBox显示的字段
}
else
{
DropDownList1.Items.Add(
"没有您可选择数据"); //如果没有数据,加载此项
}
DropDownList1.SelectedIndex
= 3; //通过索引指定第4行数据为ComboBox首选项(索引值从0开始计数)
}
#endregion

#region 通过数据指定ComboBox首选项
/// <summary>
/// 通过数据指定ComboBox首选项
/// </summary>
public void DataDrop()
{
for (int i = 0; i < DropDownList1.Items.Count; i++) //循环ComboBox中的数据
{
Model.Person p
= (Model.Person)DropDownList1.Items[i]; //将第i行对象赋值给Person对象
if (p.Name == "Terry4") //判断是否为指定的数据
{
DropDownList1.SelectedIndex
= i; //如果为true,则选定该行为首选项
}
}
}
#endregion

private void DropDownList1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (DropDownList1.SelectedItem.ToString() != "没有您可选择数据")
{
Model.Person ps
= new Model.Person();
ps
= (Model.Person)DropDownList1.SelectedItem;
}
}

新建一个Silverlight类库(这个以后说Silverlight+WebService+MVC的时候也有用提前学一下)

右键解决方案--新建(Add)--新建项目(New Project)

选择silverlight--silverlight Class Library,给类库起名为Model--Ok

Model.cs
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace Model
{
public class Person
{
public int ID
{
get;
set;
}
public string Name
{
get;
set;
}
public string Age
{
get;
set;
}
}
}

MainPage.xaml.cs,MainPage.xaml的注释写的已经很详细了,所以在这里就不过多的解释了,把代码粘一粘添加下引用就可以运行了,然后进入调试模式一行一行的看一下代码。

Person类为什么在这里新建了一个Silverlight的类库,而不写在站点根目录下呢?这里说一下,因为之后的文章还会说一下Silverlight的数据中间层的处理,所以在这里先试试手,也算是对C#.Net的MVC框架进行一个小小的复习。而在这里Person类实际上就是一个实体类,用于存储及传递数据而准备的一个数据中间层的容器,我们可以看到在MainPage.xaml及MainPage.xaml.cs中,我们都用到了这个实体类,可见这个Person类的重要性,接下来我们就稍微解析一下它的作用。

首先是在cs文件中ComboBox加载的时候,我们建立了一个List泛型列表,用于将以填好数据的每个实体类存到里面,这里为什么要用List泛型呢,说起来很郁闷,我们看这句代码DropDownList1.ItemsSource = list; //指定数据源 ItemsSource属性貌似继承了一个枚举类型的接口,这样就麻烦了,我们必须给它加载List(这个地方是否可以用ArrayList或者其他的列表容器,目前不详,我没有试其他的容器,不过List我用起来感觉很爽 吼吼~)所以我们不洗把实体类对象放到List中然后去绑定...

然后我们看"通过数据指定ComboBox首选项"这个方法,这个地方更搓火,记得在C#.Net中,DropDownList有个Find....Text/Value的方法,这个方法用于检索列表中满足我们所提出的条件的数据,而在ComboBox中这个方法被和谐了,这个事儿微软做的太tm蛋疼了,于是如果我们想要找到满足条件的数据,还要循环一下ConboBox列表,然后将我们所要的数据提取出来,在获取其索引来完成"通过数据指定ComboBox首选项"这个功能~太TM不爽了,不过也没办法,可能在这个地方还有其他的好办法,或者微软封装了这个方法我没找到(我问过几个高手,他们说也只能这样做,并且说我这么做非常有效率且比较简单 吼吼).

最后我们看一下DropDownList1_SelectionChanged这个事件. 现在已经凌晨1点了,我也不想多说了,C#.Net有这个事件,并且代码跟上边的方法有类似的地方,很简单,稍微想一下就能明白了。

睡觉了~就写这么多吧,有不清楚的自己研究研究吧,毕竟自己用心想过的才明白的更透彻。

优质内容筛选与推荐>>
1、『一本通』树形DP
2、python相关资料链接
3、【ubuntu】首选项和应用程序命令(preference & application)
4、jQuery实现竖排菜单
5、c++ hmtlcxx 学习之旅


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn