今天花了点儿时间看了一下Silverlight里的一些控件,发现Silverlight中的ComboBox和C#.Net中的Dropdownlist很像,但是语法和属性却有着很大程度的区别,于是决定把这个困扰了我一个多小时的控件写一写。
做过C#.Net的人们应该对DropDownList不陌生,或者说是很熟悉(本人就非常喜欢这个控件),它的AutoPostback属性解决了java里不能瞬时联动的问题(JavaWeb中项做瞬刷级联必须配合js来实现),并且在绑定数据源上也给了我们很多惊喜,但是今天看到Silverlight中的ComboBox感觉很失落,虽然它在Dropdownlist的基础上做了一些改进,但是用管了DropDownlist的程序员在初探ComboBox这个控件的时候会感觉很陌生,接下来就用代码说话吧...
MainPage.xaml
MainPage.xaml
<ComboBox x:Name="DropDownList1" Width="128" Height="24"SelectionChanged="DropDownList1_SelectionChanged"></ComboBox>
<!-- DropDownList1_SelectionChanged:数据发生改变时触发事件 -->
</Grid>
{
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;
}
}
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;
}
}
}
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有这个事件,并且代码跟上边的方法有类似的地方,很简单,稍微想一下就能明白了。
-转自 刘欢博客斋's sina博客