欢迎来到天天培训网!全国[切换城市] 登录 注册
首页 发布课程 机构平台 手机浏览

手机扫一扫

咨询热线

400-0808-102

苏州北大青鸟_分析多路的Binding

  • 联 系 人:老师(先生) 
  • 咨询热线:0512-66555771
  • 授课学校:苏州北大青鸟培训中心
  • 授课地址:苏州市姑苏区养育巷49号2楼
课程推荐

苏州北大青鸟_暑假编

面议

苏州北大青鸟_网络营

面议

苏州北大青鸟_java程

面议

苏州北大青鸟_Java 概

面议

苏州北大青鸟_在职转

面议

苏州北大青鸟_网络营

面议

机构信息

所在地区:江苏 苏州市

会员级别:VIP会员10

身份认证:      

已  缴 纳:0.00 元保证金

我的勋章:  通过认证 [诚信档案]

在线客服:

机构名片

苏州北大青鸟培训中心

微信客服
【温馨提示】来电请说明在天天培训网看到我们的,谢谢
课程详情
 

分析多路的Binding

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

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

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

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

  1. using System;

  2. using System.Collections.Generic;

  3. using System.Linq;

  4. using System.Text;

  5. using System.Windows;

  6. using System.Windows.Controls;

  7. using System.Windows.Data;

  8. using System.Windows.Documents;

  9. using System.Windows.Input;

  10. using System.Windows.Media;

  11. using System.Windows.Media.Imaging;

  12. using System.Windows.Navigation;

  13. using System.Windows.Shapes;

  14. namespace MultiBindingSample

  15. {

  16.    public partial class Window1 : Window

  17.    {

  18.        public Window1()

  19.        {

  20.            InitializeComponent();

  21.            // 准备作为基础的“一对一”子Binding

  22.            Binding b1 = new Binding("Text") { Source = this.textBox1 };

  23.            Binding b2 = new Binding("Text") { Source = this.textBox2 };

  24.            Binding b3 = new Binding("Text") { Source = this.textBox3 };

  25.            Binding b4 = new Binding("Text") { Source = this.textBox4 };

  26.            // 准备一对一Binding的包装箱,并把子Binding装进去

  27.            MultiBinding mb = new MultiBinding();

  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 = new SubmitEnableConverter();

  34.            mb.Mode = BindingMode.OneWay;

  35.            // 为Button设置多路Binding

  36.            this.button1.SetBinding(Button.IsEnabledProperty, mb);

  37.        }

  38.    }

  39.    public class SubmitEnableConverter : IMultiValueConverter // 注意Converter基类的变化

  40.    {

  41.        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)

  42.        {

  43.            // 使用Lambda表达式判断,只要有空的,就返回false

  44.            return !values.Cast<string>().Any(text => string.IsNullOrEmpty(text));

  45.        }

  46.        // 因为是只从数据源到目标的方向Binding,所以,这个函数永远也不会被调到

  47.        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)

  48.        {

  49.            throw new NotImplementedException();

  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属性值。

咨询电话:0512-66555771  联系QQ :1294015820

更多请点击进入:https://www.ttpx.net/index.php?homepage=szbdqnxxwll

学校地址:苏州市姑苏区养育巷492

苏州北大青鸟|苏州北大青鸟学校|苏州北大青鸟中心

免责声明

本网页所展示的有关【苏州北大青鸟_分析多路的Binding】的信息/图片/参数等由的会员【苏州北大青鸟培训中心 】提供,由天天培训网会员【苏州北大青鸟培训中心 】自行对信息/图片/参数等的真实性、准确性和合法性负责,本平台(本网站)仅提供展示服务,请谨慎交易,因交易而产生的法律关系及法律纠纷由您自行协商解决,本平台(本网站)对此不承担任何责任。您在本网页可以浏览【苏州北大青鸟_分析多路的Binding】有关的信息/图片/价格等及提供 【苏州北大青鸟_分析多路的Binding】的商家公司简介、联系方式等信息。

在您的合法权益受到侵害时,请您致电400-0808-102,我们将竭诚为您服务,感谢您对天天培训网的关注与支持!