`
lovnet
  • 浏览: 6969528 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

深入浅出WPF(10)——“脚踩N条船”的多路Binding

阅读更多

深入浅出WPF(10)——“脚踩N条船”的多路Binding

小序:

通过前面几个章节的学习,我们已经了解了Data Binding的基本常识和简单的使用方法。今天让我们更进一步,学习一下多路Data Binding。

说实话,起“脚踩N条船”这个标题,实在有点不雅,可为了让大家记忆方便,我也管不了那么多鸟~~~那么什么是多路Binding、它有什么用、怎么用呢?

正文:

让我们分析这样一个需求——UI上有若干个文本框和一个“提交”按钮,这些文本框都是用户必须填写的,如果不都填写,提交按钮是不可用的。

习惯了使用WinForm的同学可能脑子里已经开始飞速地搜寻使用Event来解决的方案了。实际上,在WPF里使用多路Data Binding将非常简单。所谓“多路Binding(也可以叫复合Binding)”就是指某个元素的Dependency Property的值不是由单一的数据源来决定,而是由多个数据源(通过一定逻辑)共同决定的,我们一般会把逻辑写在Converter里。是不是颇有些“脚踩N条船”的意思?

多路Binding使用的类是MultiBinding类,这个类实际上就是对一组Binding对象的包装——本质上并没有影响Binding是“一对一”的基本理论。

下面让我们动手实现这个例子,因为大家已经对WPF的基本编程很熟悉了,所以我只把核心代码写在下面(又一次,我违反代码维护性原则,把它们写在了窗体的构造程序中)。

  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Linq;
  4. usingSystem.Text;
  5. usingSystem.Windows;
  6. usingSystem.Windows.Controls;
  7. usingSystem.Windows.Data;
  8. usingSystem.Windows.Documents;
  9. usingSystem.Windows.Input;
  10. usingSystem.Windows.Media;
  11. usingSystem.Windows.Media.Imaging;
  12. usingSystem.Windows.Navigation;
  13. usingSystem.Windows.Shapes;
  14. namespaceMultiBindingSample
  15. {
  16. publicpartialclassWindow1:Window
  17. {
  18. publicWindow1()
  19. {
  20. InitializeComponent();
  21. //准备作为基础的“一对一”子Binding
  22. Bindingb1=newBinding("Text"){Source=this.textBox1};
  23. Bindingb2=newBinding("Text"){Source=this.textBox2};
  24. Bindingb3=newBinding("Text"){Source=this.textBox3};
  25. Bindingb4=newBinding("Text"){Source=this.textBox4};
  26. //准备一对一Binding的包装箱,并把子Binding装进去
  27. MultiBindingmb=newMultiBinding();
  28. mb.Bindings.Add(b1);
  29. mb.Bindings.Add(b2);
  30. mb.Bindings.Add(b3);
  31. mb.Bindings.Add(b4);
  32. //为多路Binding配备决策逻辑(它是一个多路Converter),并设置为OneWay
  33. mb.Converter=newSubmitEnableConverter();
  34. mb.Mode=BindingMode.OneWay;
  35. //为Button设置多路Binding
  36. this.button1.SetBinding(Button.IsEnabledProperty,mb);
  37. }
  38. }
  39. publicclassSubmitEnableConverter:IMultiValueConverter//注意Converter基类的变化
  40. {
  41. publicobjectConvert(object[]values,TypetargetType,objectparameter,System.Globalization.CultureInfoculture)
  42. {
  43. //使用Lambda表达式判断,只要有空的,就返回false
  44. return!values.Cast<string>().Any(text=>string.IsNullOrEmpty(text));
  45. }
  46. //因为是只从数据源到目标的方向Binding,所以,这个函数永远也不会被调到
  47. publicobject[]ConvertBack(objectvalue,Type[]targetTypes,objectparameter,System.Globalization.CultureInfoculture)
  48. {
  49. thrownewNotImplementedException();
  50. }
  51. }
  52. }

整个程序并没有什么难理解的,与我们以前学习的Binding最大的区别就在它的Converter上,这回使用的Converter,其基接口是IMultiValueConverter,而不是先前我们使用的IValueConverter。这个接口仍然只有两个函数需要实现一下。又因为我们这次使用的是OneWay模式,所以,代码中只有Convert函数中包含逻辑。

请大家注意,Convert函数中最重要的就是它的values参数。这个参数是一个数组,这个数组里包含的就是从一对一子Binding里送来的值(在我们的程序里,就是4个TextBox的Text属性值)。数组是可被索引的,这就意味着values里面的值是有顺序的!那么这个顺序是什么呢?这个顺序就是你调用MultiBinding.Bindings.Add(...)添加子Binding顺序——我认为这里是多路Binding一个小小的败笔——这样,写出来的代码会比较脆弱、顺序不能变,而且比较隐晦。换句话说,后来的程序员如果改变一下Add的顺序,就有可能导致程序出现很难测出的bug。

本例中,values[0]对应的是textBox1.Text属性值、values[1]对应的是textBox2.Text属性值、values[2]对应的是textBox3.Text属性值、values[3]对应的是textBox4.Text属性值。

然后,我使用Lambda表达式,判断了一下是否有某个TextBox值是空的,对这个值取反,就是Submit Button.IsEnable的值。

运行效果如下:

逻辑进阶

现在客户的需求变了。要求是,前两个文本框的内容一致、后两个文本框内容一致,这时候Submit才亮(这在注册新用户的时候经常遇到)。

要是在WinForm中使用Event实现,就会有多处事件处理函数有变更,而在这个例子中,我们只需改一两句代码就OK了。下面的代码中,我优化了格式——项目中推荐这样的格式。

  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Linq;
  4. usingSystem.Text;
  5. usingSystem.Windows;
  6. usingSystem.Windows.Controls;
  7. usingSystem.Windows.Data;
  8. usingSystem.Windows.Documents;
  9. usingSystem.Windows.Input;
  10. usingSystem.Windows.Media;
  11. usingSystem.Windows.Media.Imaging;
  12. usingSystem.Windows.Navigation;
  13. usingSystem.Windows.Shapes;
  14. namespaceMultiBindingSample
  15. {
  16. ///<summary>
  17. ///InteractionlogicforWindow1.xaml
  18. ///</summary>
  19. publicpartialclassWindow1:Window
  20. {
  21. publicWindow1()
  22. {
  23. InitializeComponent();
  24. InitializeBindings();//拎出来封装
  25. }
  26. privatevoidInitializeBindings()
  27. {
  28. //声名、定义并初始化MultiBinding
  29. MultiBindingmb=newMultiBinding(){Mode=BindingMode.OneWay,Converter=newSubmitEnableConverter()};
  30. mb.Bindings.Add(newBinding("Text"){Source=this.textBox1});
  31. mb.Bindings.Add(newBinding("Text"){Source=this.textBox2});
  32. mb.Bindings.Add(newBinding("Text"){Source=this.textBox3});
  33. mb.Bindings.Add(newBinding("Text"){Source=this.textBox4});
  34. //为Button设置多路Binding
  35. this.button1.SetBinding(Button.IsEnabledProperty,mb);
  36. }
  37. }
  38. //Converter
  39. publicclassSubmitEnableConverter:IMultiValueConverter//注意Converter基类的变化
  40. {
  41. publicobjectConvert(object[]values,TypetargetType,objectparameter,System.Globalization.CultureInfoculture)
  42. {
  43. //按对应值做决策
  44. if(!values.Cast<string>().Any(text=>string.IsNullOrEmpty(text))
  45. &&values[0].ToString()==values[1].ToString()
  46. &&values[2].ToString()==values[3].ToString())
  47. {
  48. returntrue;
  49. }
  50. returnfalse;
  51. }
  52. //因为是只从数据源到目标的意向Binding,所以,这个函数永远也不会被调到
  53. publicobject[]ConvertBack(objectvalue,Type[]targetTypes,objectparameter,System.Globalization.CultureInfoculture)
  54. {
  55. thrownewNotImplementedException();
  56. }
  57. }
  58. }

运行效果如下:

最后,希望大家玩儿的开心!也希望明天即将开幕的奥运会圆满、顺利!

OVER

分享到:
评论

相关推荐

    《深入浅出 WPF》 完整目录版

    《深入浅出 WPF》 完整目录版是一本非常好动书,并且做了完整目录

    深入浅出WPF-刘铁猛-MVVM视频源代码,MVVM入门与提高视频对应的源代码

    **深入浅出WPF——MVVM模式解析** 在软件开发领域,Windows Presentation Foundation(WPF)是Microsoft推出的一种用于构建Windows桌面应用程序的技术,它提供了丰富的用户界面和图形渲染能力。而MVVM(Model-View-...

    WPF深入浅出书上全部实例源码,非常详细

    **深入浅出WPF:全书实例源码详解** Windows Presentation Foundation(WPF),作为.NET Framework的一部分,是Microsoft推出的一种全新的用户界面框架,用于构建Windows桌面应用程序。它提供了丰富的图形层、数据...

    高清版WPF深入浅出.pdf

    本书《深入浅出WPF》是刘铁猛所著,目的是为了深入浅出地介绍WPF技术。作者利用丰富的开发经验和对技术的深刻理解,将WPF的复杂概念分解成浅显易懂的知识点。全书分为两个主要部分,第一部分主要介绍WPF开发的基础...

    WPF深入浅出高清PDF

    ### WPF深入浅出知识点详解 #### 一、引言:生产力与软件开发工具的进化 自古以来,生产工具的先进程度一直是衡量生产力水平的关键指标。随着科技的进步,计算机软件开发领域同样经历了一系列工具和技术的革新。从...

    WPF深入浅出电子书

    WPF深入浅出电子书,可以下载放到手机里看,非常的方便的。

    WPF深入浅出(高清.书签)

    《WPF深入浅出》是一本专注于Windows Presentation Foundation(WPF)技术的书籍,由国内作者撰写,确保了内容的准确性和本地化适应性。WPF是微软.NET Framework中的一个关键组件,它提供了构建富客户端应用程序的...

    WPF深入浅出_包含源代码

    **WPF 深入浅出 - 包含源代码** Windows Presentation Foundation(WPF),是微软.NET Framework的重要组成部分,它提供了一种全新的用户界面开发技术,用于构建丰富的、交互式的桌面应用程序。这本书《WPF深入浅出...

    wpf深入浅出资源文件,需要源码的可以给我@我

    **WPF 深入浅出:资源文件与源码详解** Windows Presentation Foundation(WPF)是Microsoft .NET Framework中的一个关键组件,用于构建富客户端应用程序。它提供了丰富的图形渲染能力、强大的数据绑定机制以及对...

    wpf 揭秘 wpf揭秘——part1.rar

    wpf 揭秘 一共两部分,请下载: wpf 揭秘 wpf揭秘——part1.rar wpf 揭秘 wpf揭秘——part2.rar 然后解压。

    WPF深入浅出.zip

    在《WPF深入浅出》这本书中,你将会深入学习WPF的核心概念和技术,包括: 1. **XAML语言**:WPF的主要设计工具,XML-based的语言,用于描述UI元素和它们的属性。通过XAML,开发者可以以声明式的方式构建UI,使得...

    wpf 揭秘 wpf揭秘——part2.rar

    wpf 揭秘 一共两部分,请下载: wpf 揭秘 wpf揭秘——part1.rar wpf 揭秘 wpf揭秘——part2.rar 然后解压。

    wpf 深入浅出 pdf

    ### WPF深入浅出知识点概览 #### 一、WPF简介 WPF(Windows Presentation Foundation)是微软推出的一种用于构建Windows客户端应用程序的框架。它提供了丰富的功能集,包括矢量图形支持、基于XAML的标记语言、数据...

    WPF揭秘——wpf基础教程

    **WPF揭秘——深入理解Windows Presentation Foundation** Windows Presentation Foundation(WPF)是Microsoft .NET Framework的一个重要组成部分,它为开发者提供了构建桌面应用程序的强大工具。这个基础教程将带...

    WPF深入浅出.pdf

    刘铁猛在其著作《深入浅出WPF》中,详细解析了WPF的各个方面,包括XAML、数据绑定、事件、命令、资源、模板、绘图及动画等,并结合自己多年的开发经验,通过具体的例子和源码分析,力求使读者能深入理解WPF的同时,...

    深入浅出PDF

    推荐给WPF零基础的人。

Global site tag (gtag.js) - Google Analytics