多路Binding

本文详细介绍了如何在WPF应用中利用MultiBinding处理多个数据源,实现多个TextBox的值一致性验证,并与Button交互,确保只有在所有TextBox内容都符合特定条件时,Button才可用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  当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);
        }

 

转载于:https://www.cnblogs.com/yijiaoyingbi/p/4870947.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值