多路Binding

  当UI需要显示的信息由多个数据源来决定的时候就需要使用MultiBinding,即多路Binding。MultiBinding与Binding一样均以BindingBase为基类,也就是说凡是能使用Binding对象的场合都能使用MultiBinding。

  MultiBinding具有一个名为Bindings的属性,其类型为Collection<BindingBase>,通过这个属性把一组Binding对象聚合起来,处在这个集合中的Binding对象可以拥有自己的数据校验和转换机制,它们汇集起来的数据将共同决定传往MultiBinding目标的数据。

  以用户注册需求为例,UI包括四个TextBox和一个Button,第一、二个TextBox输入用户名,要求内容一致,第三、四个TextBox输入密码,要求内容一致,当TextBox内容完全符合要求时Button才可用。

  XAML代码如下:

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="210" Width="300">
    <StackPanel>
        <TextBox x:Name="t1" Height="23" Margin="5"></TextBox>
        <TextBox x:Name="t2" Height="23" Margin="5"></TextBox>
        <TextBox x:Name="t3" Height="23" Margin="5"></TextBox>
        <TextBox x:Name="t4" Height="23" Margin="5"></TextBox>
        <Button x:Name="b1" Content="提交" Height="23" Margin="5"></Button>
    </StackPanel>
</Window>

  创建自定义Converter,代码如下:

    public class CommitMultiBindingConverter:IMultiValueConverter
    {

        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if(!values.Cast<String>().Any(text=>string.IsNullOrEmpty(text)) && values[0].ToString()==values[1].ToString() && values[2].ToString()==values[3].ToString())
            {
                return true;
            }
            return false;
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

  设置MultiBinding,代码如下:

        public MainWindow()
        {
            InitializeComponent();

            SetMultiBinding();
        }

        private void SetMultiBinding()
        {
            //准备Binding
            Binding b1 = new Binding("Text") { Source = this.t1 };
            Binding b2 = new Binding("Text") { Source = this.t2 };
            Binding b3 = new Binding("Text") { Source = this.t3 };
            Binding b4 = new Binding("Text") { Source = this.t4 };

            //准备MultiBinding
            MultiBinding mb = new MultiBinding() { Mode = BindingMode.OneWay };
            mb.Bindings.Add(b1);
            mb.Bindings.Add(b2);
            mb.Bindings.Add(b3);
            mb.Bindings.Add(b4);
            mb.Converter = new CommitMultiBindingConverter();

            //将Binding与Button关联
            this.b1.SetBinding(Button.IsEnabledProperty, mb);
        }
时间: 2024-12-04 14:52:59

多路Binding的相关文章

【转载一篇WPF之Binding】WPF之Binding深入探讨

1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要.但算法在3层中的分布是不均匀的,对于一个3层结构的程序来说,算法一般分布在这几处: A.数据库内部. B.读取和写回数据. C.业务逻辑. D.数据展示. E.界面与逻辑的交互. A,B两部分的算法一般都非常稳定,不会轻易去改动,复用性也很高:C处与客户需求最紧密,最复杂,变化最大,大多少算法都集中在这里.D,E负责UI和逻辑的交互,也占有一定量的

Binding笔记

Binding基础  绑定某个对象的属性值到控制上,写法如下: public class Order : INotifyPropertyChanged//只要实现此接口 { public event PropertyChangedEventHandler PropertyChanged; private string orderNo; public string OrderNo { get { return orderNo; } set { orderNo = value; if (Proper

Binding

Binding基础  绑定某个对象的属性值到控制上,写法如下: public class Order : INotifyPropertyChanged//只要实现此接口 { public event PropertyChangedEventHandler PropertyChanged; private string orderNo; public string OrderNo { get { return orderNo; } set { orderNo = value; if (Proper

WPF之Binding深入探讨

1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都非常重要.但算法在3层中的分布是不均匀的,对于一个3层结构的程序来说,算法一般分布在这几处: A.数据库内部. B.读取和写回数据. C.业务逻辑. D.数据展示. E.界面与逻辑的交互. A,B两部分的算法一般都非常稳定,不会轻易去修改,复用性也非常高:C处与客户需求最紧密,最复杂,变化最大,大多少算法都集中在这里.D,E负责UI和逻辑的交互,也占有一定

WPF Data Binding之数据的转换和校验【四】

Binding的作用就是架在Source和Target之间的桥梁,数据可以在这座桥梁的帮助下来流通.就像现实社会中桥梁需要设置安检和关卡一样,Binding这座桥上也可以设置关卡对数据进行验证,不仅如此,如果Binding两端需要不同的数据类型的时候我们还可以为数据设置转换器. Binding用于数据有效性校验的关卡是他的ValidationRules属性,用于数据类型转换的关卡是它的Convert属性. 1.1 Binding的数据校验 Binding的ValidationRules属性是Co

WPF之Binding【转】

WPF之Binding[转] 看到WPF如此之炫,也想用用,可是一点也不会呀. 从需求谈起吧: 首先可能要做一个很炫的界面.见MaterialDesignInXAMLToolKit. 那,最主要的呢,还是想显示数据. 就先来数据,数据可以从数据库里得到,可是如何显示出来呢? 本文的主角出来了:(以下内容全转载他人,具体 原文见上面的链接) ==================================== 1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.

WPF学习之Binding(二)

前言: (一)里面简单学习了Binding的基础.源.路径.如何控制Binding的方向及数据更新.使用DataContext作为Binding的源等 使用集合对象作为列表控件的ItemSource WPF列表式控件派生自ItemControl类,自然继承了ItemSource这个属性. 例如:ListBox条目容器ListBoxItem,ComboBox条目容器ComboBoxItem. ItemSource里存着一条条数据,想要显示出来必须借助条目容器.Binging就是用来联系条目容器和数

学习WPF之 Binding

最近在学习WPF,通过看书,敲代码和做笔记等各种方式.昨天学习完了Binding这一章... ... 画了张图进行总结,以备遗忘时查看. 1.Binding数据的校验 public _02Binding_ValidationRules() { InitializeComponent(); Binding binding = new Binding("Value") { Source = slider1, UpdateSourceTrigger = UpdateSourceTrigger

深入浅出WPF之MultiBinding--笔记(2015.03.10)

当UI需要显示的信息由不止一个数据来源决定,此时需要使用MultiBinding,即多路Binding.MultiBinding与Binding都以BindingBase为基类,也就是说,凡是能使用Binding对象的场合都能使用MultiBinding.MultiBinding具有一个名为Bindings的属性,其类型是Collection<BindingBase>,通过这个属性MultiBinding把一组Binding对象聚合起来,处在该集合中的Binding对象都可以拥有自己的数据校验