数据绑定 多路绑定MultiBinding

有时候UI要显示的信息又不止一个数据来源决定,就需要使用MultiBinding,MultiBinding具有一个名为Bindings的属性,其类型是Collection<BindingBase>,通过这个属性MultiBinding把一组Binding对象聚合起来,处在这个集合中的Binding对象可以拥有自己的数据校验与转换机制,它们汇集起来的数据将共同决定传往MultiBinding目标的数据。

举例:有如下界面

    <StackPanel Background="LightBlue">
        <TextBox x:Name="textBox1" Height="23" Margin="5" />
        <TextBox x:Name="textBox2" Height="23" Margin="5,0" />
        <TextBox x:Name="textBox3" Height="23" Margin="5" />
        <TextBox x:Name="textBox4" Height="23" Margin="5" />
        <Button x:Name="button1" Content="Submit" Width="80" Margin="5" />
    </StackPanel>


后台代码中设置MultiBinding

            Binding b1 = new Binding("Text") { Source = textBox1 };
            Binding b2 = new Binding("Text") { Source = textBox2 };
            Binding b3 = new Binding("Text") { Source = textBox3 };
            Binding b4 = new Binding("Text") { Source = textBox4 };

            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 LogonMultiBindingConverter();
            button1.SetBinding(Button.IsEnabledProperty, mb);

转换器由于需要对多个值进行转换,所以需要使用IMultiValueConverter的派生类进行转换,转换器代码

    class LogonMultiBindingConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, 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[] targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }


运行效果如图

原文地址:https://www.cnblogs.com/btbear/p/3383682.html