• 多路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);
            }
  • 相关阅读:
    jupyter 更新环境变量 %env
    viterbi 维特比解码过程,状态转移矩阵
    ValueError: cannot index with vector containing NA / NaN values
    python ElasticSearch ES 搜索词 完全匹配 精准匹配
    首页 如何在Jupyter中抑制回溯?
    python 操作ES
    python 玩转 侦探游戏 嫌疑犯 真假话 侦探推理
    python – 解析pcfg语法树 提取其语法规则 Probabilistic Context-Free Grammar Parser
    2019-09-18 关键字匹配文件名--搜索文件
    2019-07-21 win10安装rabbitmq与启动
  • 原文地址:https://www.cnblogs.com/yijiaoyingbi/p/4870947.html
Copyright © 2020-2023  润新知