桂林电子科技大学学生学习深入浅出WPF3数据的绿色通道Binding(下)

上传人:平*** 文档编号:12742706 上传时间:2017-10-20 格式:DOC 页数:10 大小:152.50KB
返回 下载 相关 举报
桂林电子科技大学学生学习深入浅出WPF3数据的绿色通道Binding(下)_第1页
第1页 / 共10页
桂林电子科技大学学生学习深入浅出WPF3数据的绿色通道Binding(下)_第2页
第2页 / 共10页
桂林电子科技大学学生学习深入浅出WPF3数据的绿色通道Binding(下)_第3页
第3页 / 共10页
桂林电子科技大学学生学习深入浅出WPF3数据的绿色通道Binding(下)_第4页
第4页 / 共10页
桂林电子科技大学学生学习深入浅出WPF3数据的绿色通道Binding(下)_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《桂林电子科技大学学生学习深入浅出WPF3数据的绿色通道Binding(下)》由会员分享,可在线阅读,更多相关《桂林电子科技大学学生学习深入浅出WPF3数据的绿色通道Binding(下)(10页珍藏版)》请在金锄头文库上搜索。

1、深入浅出 WPF 第三辑 数据的绿色通道,Binding(下) 小序: 看着自己上一篇技术文章,屈指算来,已经月余没有动笔了实在是不像话。最近一来是忙工作,二来是兴趣点放在了设计模式上,而且尝试着把设计模式也“深入浅出”了一把,当然啦,因为对于 design pattern 我也是初学,在没有经过大家检验之前我是不敢拿到blog 里丢人现眼滴现在项目组里由喵喵同学、美女燕、大马同学和小马同学一同 push 一个“设计模式沙龙”,大家一起学习和讨论这些模式和如何应用在我们的项目里做重构。等活动结束后,我心里有底了,就把文章放上来:) 正文如果用一句话概括前几篇关于 data binding 的文

2、章,那就是:介绍了数据驱动(界面)开发的基本原理,以及如何使用 Binding 类的实例连接数据源与数据表现元素、形成一对一的 binding(为了让数据有效、安全,我们还可以添加 Converter 和 ValidationRule 等附件)。注意啦,我强调了一下是一对一的 binding 哦!也就是说,一个 binding 实例一端是数据源、一端是表现元素。现在问题来了:实际工作中,我们操作的大部分数据都是集合,怎么进行“群体 binding”呢?呵呵,这就引出了我们今天的第一个 topic对集合进行binding。集合 Binding 揭秘我们想这样一个问题如果我有一个 List的实例,

3、里面装着二十个 Student 对象,现在我想让一个 ListBox 显示出学生的Name,并且当集合中有 Student 对象的 Name 发生改变时,ListBox 的 Item 也立刻显示出来,应该怎么做呢?有人会说:那还不好办?做一个循环,按照集合元素的数量生成相应多的 ListBoxItem,并把每个 ListBoxItem 的 Text 属性(如果有)用 Binding 一对一连接到 List 中的 Student 对象上不就结了?我没试过这样行不行,但我知道,这违反了“数据驱动 UI”的原则请记住,在 WPF 开发时,不到万不得已,不要去打 UI 元素的主意、不要把 UI 元素掺

4、合进任何运算逻辑。拿上面的例子来说,手动地去生成 ListBoxItem 就已经超越了“数据驱动 UI”的限制,是不恰当的作法。OK,让我们看看微软提供的“正宗集合 binding”吧!首先我们得准备一个用来存放数据的集合,对于这个集合有一个特殊的要求,那就是,这个集合一定要是实现了 IEnumerable 接口的集合。为什么呢?原因很简单,实现了 IEnumerable 接口就意味着这个集合里的元素是可枚举的,可枚举就意味着这个集合里的元素是同一个类型的(至少具有相同的父类),元素是同一个类型的就意味着在每个元素中我都能找到同样的属性。举个例子,如果一个实现了IEnumerable 的集合里

5、装的是 Student 元素,这就意味着每个元素都有诸如 ID、Name、Age 等属性,对于任何一个元素我都不会找不到 ID、Name 或者 Age不然就没办法“批量 binding”了;如果一个实现了 IEnumerable 接口的集合里除了有 Student 对象,还有Teacher 对象、Programmer 对象,怎么办呢?这时候,这个集合肯定只能拿 Student、Teacher、Programmer 的共同基类来进行枚举了,假设它们的共同基类是 Human,那 Human 至少会有 Name 和 Age 属性吧 我们可以拿这两个属性去做 binding 的 Path,而集合里的每

6、一个元素都作为一个独立的数据源。下面我给出核心代码。首先我们准备了一个 Student 类,包含 StuNum、Name、Age 三个属性,view plaincopy to clipboardprint?1. class Student 2. 3. public int StuNum get; set; 4. public string Name get; set; 5. public int Age get; set; 6. 然后我们在 Window 的 Grid 元素里添加一个 ListBox,这个操作是在 XAML 文件里做的:view plaincopy to clipboardpr

7、int?1. 2. 3. 4. 5. 显示出来的效果是这样的:接下来,我们使用集合 binding,让 ListBox 把学生的名字显示出来。为了方便起见,我把逻辑代码写在了 Window 的构造函数里,请大家注意做项目的时候要尽量保持构造函数里的“干净” ,很多很多紧耦合都是不小心在构造函数里“ 创造”出来的。1. /水之真谛出品 2. / http:/ 3.4. public Window1() 5. 6. InitializeComponent(); 7. List stuList = new List() 8. 9. new StudentStuNum=1, Name=Tim, Age

8、=28, 10. new StudentStuNum=2, Name=Ma Guo, Age=25, 11. new StudentStuNum=3, Name=Yan, Age=25, 12. new StudentStuNum=4, Name=Xaiochen, Age=28, 13. new StudentStuNum=5, Name=Miao miao, Age=24, 14. new StudentStuNum=6, Name=Ma Zhen, Age=24 15. ; 16.17. this.listBox1.ItemsSource = stuList; 18. this.list

9、Box1.DisplayMemberPath = Name; 19. 立竿见影地说,你马上就能看到效果:其实,最有用的就是最后两句代码:this.listBox1.ItemsSource = stuList;一句的意思是告诉 ListBox 说:stuList 这个集合里的元素就是你的条目啦!也就是说,stuList 就等同于 listBox1.Items 了。集合对集合,意味着两个集合里的元素也将一一对应。显然,stuList 集合里的元素是 ListBox.Items 集合里元素的数据源,两个集合里的元素一一对应。还有一句,this.listBox1.DisplayMemberPath =

10、 Name;,是告诉 ListBox 说,你的每个条目不是要显示点东西给用户看吗?那你就显示“Name”属性的值吧!你可能会问:它怎么知道去找 Student 对象的 Name 属性呀?你想呀,前面说过,能用于做数据源的集合一定实现了 IEnumerable 接口(List 5. 6. 7. 8. 9. 10. 11. 效果如图:如果客户的要求比较简单,就是选中 ListBox 中的一项后,只查看它的某一个属性(比如选中一个学生的名字,只看他的学号),那这时候我们有个简单的办法每个成功男人的背后都有一个女人;每个显示出来的 Text 背后都隐藏着一个 Value!1. public Windo

11、w1() 2. 3. InitializeComponent(); 4. List stuList = new List() 5. 6. new StudentStuNum=1, Name=Tim, Age=28, 7. new StudentStuNum=2, Name=Ma Guo, Age=25, 8. new StudentStuNum=3, Name=Yan, Age=25, 9. new StudentStuNum=4, Name=Xaiochen, Age=28, 10. new StudentStuNum=5, Name=Miao miao, Age=24, 11. new S

12、tudentStuNum=6, Name=Ma Zhen, Age=24 12. ; 13.14. this.listBox1.ItemsSource = stuList; 15. this.listBox1.DisplayMemberPath = Name; 16. this.listBox1.SelectedValuePath = StuNum; 17.18. this.stuNumTextBox.SetBinding(TextBox.TextProperty, new Binding(SelectedValue) Source = this.listBox1 ); 19. this.li

13、stBox1.SelectedValuePath = StuNum;这句代码的意思是说:如果 ListBox 里的某一条 Item 被选中了,那么 ListBox 就去找到与这条 Item 所对应的数据源集合里的那个元素,并把这个元素的 StuNum 属性的值拿出来,当作当前选中 Item 的值。最后一句是把TextBox 的 Text 依赖属性关联到 listBox1 的 SelectedValue 上。运行起来的效果就是:如果客户要求显示所有信息,那这种“简装版” 的 binding 就不灵了,因为它只能拿到一个值。这时候,我们需要这样做:1. public Window1() 2. 3.

14、 InitializeComponent(); 4. List stuList = new List() 5. 6. new StudentStuNum=1, Name=Tim, Age=28, 7. new StudentStuNum=2, Name=Ma Guo, Age=25, 8. new StudentStuNum=3, Name=Yan, Age=25, 9. new StudentStuNum=4, Name=Xaiochen, Age=28, 10. new StudentStuNum=5, Name=Miao miao, Age=24, 11. new StudentStuNum=6, Name=Ma Zhen, Age=24 12. ; 13.14. this.listBox1.ItemsSource = stuList; 15. this.listBox1.DisplayMemberPath = Name; 16. /this.listBox1.SelectedValuePath = StuNum; 17.18. this.stuNumTextBox.SetBinding(TextBox.TextProperty, new Binding(SelectedItem.StuNum) Sourc

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号