ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

WPF UI元素间的Binding

2022-06-27 16:02:44  阅读:273  来源: 互联网

标签:mb object Binding UI new WPF public


WPF UI元素间的Binding

WPF的Binding起到桥梁的作用,UI元素之间的绑定,即binding的源是UI元素,目标也是UI元素,然后用Binding架起元素与元素属性(Property)之间的桥梁,最近学习深入浅出WPF这本书,整理了以下学习内容,和大家分享。

1. UI元素之间的绑定(直接绑定)

直接将TexrBox属性关联在Slider的Value属性上

      	<Window x:Class="WpfApp9.MainWindow"                              
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DirectBinding" Height="110" Width="300">
    <StackPanel>
        <TextBox x:Name="textBox1" Text="{Binding Path=Value,ElementName=slider1}" BorderBrush="Black" Margin="5"/>
        <Slider x:Name="slider1" Maximum="100" Minimum="0" Margin="5"/>
    </StackPanel>
	</Window>

    

2. UI元素之间的绑定(转换器)

将TexrBox是否为空绑定为按钮是否可用,即textBox为空,按钮不可用,textBox有输入内容,按钮button可用

  1. 添加转换器StringToEnableConverter类,此类需要继承IValueConverter,并实现Convert和ConvertBack方法。
     public class StringToEnableConverter : IValueConverter
    {
        // 将String转换为是否可用的Bool类型,为空则按钮不可用,否则为可用
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string str = (string)value;
            if (!string.IsNullOrEmpty(str))
            {
                return true;
            }
            return false;
        }
        // 反向转换器,暂时用不到
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    
  2. 在前台添加引用对上步骤中声明转换器的命名空间的引用,见代码xmlns:local="clr-namespace:WpfApp9",
    然后添加Window.Resources中具体转换器的引用并添加key值,见代码<local:StringToEnableConverter x:Key="ste"/>,
    最后在Button的IsEnabled属性中进行Binding,见代码IsEnabled="}"
      <Window x:Class="WpfApp9.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApp9"
        Title="ConverterBinding" Height="110" Width="300">
    <Window.Resources>
        <local:StringToEnableConverter x:Key="ste"/>
    </Window.Resources>
    <StackPanel>
        <TextBox x:Name="textBox1" BorderBrush="Black" Margin="5"/>
        <Button Height="20" Width="60" Content="button" IsEnabled="{Binding Path=Text,ElementName=textBox1,Converter={StaticResource ste}}" Margin="5"/>
    </StackPanel>
</Window>

    

3. UI元素之间的绑定(多个UI元素Binding,MutiBinding)

UI界面包含4个TextBox和一个Button,第一、二个TextBox输入内容(用户名)一致,第三、四个TextBox输入内容(密码)一致,Button可用,否则不可用

  1. 添加转换器LogonMultiBindingConverter,此类需要继承IMultiValueConverter,同样要实现Convert和ConvertBack方法,具体实现内容如下:
          public 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[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

    
  1. 前台(Xaml)页面仅绘出页面,代码如下:
      <Window x:Class="WpfApp9.Window5"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MutiBinding" Height="185" Width="300">
    <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,0"/>
        <Button x:Name="button1" Content="Submit" Width="80" Margin="5"/>
    </StackPanel>
</Window>

    
  1. 后台进行MutiBinding,代码如下:
          public partial class Window5 : Window
    {
        public Window5()
        {
            InitializeComponent();
            SetMultiBinding();
        }

        private void SetMultiBinding()
        {
            // 准备基础 Binding
            Binding b1 = new Binding("Text") { Source = this.textBox1 };
            Binding b2 = new Binding("Text") { Source = this.textBox2 };
            Binding b3 = new Binding("Text") { Source = this.textBox3 };
            Binding b4 = new Binding("Text") { Source = this.textBox4 };

            // 准备 MultiBinding
            MultiBinding mb = new MultiBinding() { Mode = BindingMode.OneWay };
            mb.Bindings.Add(b1);    // 注意:MultiBinding 对 Add 子 Binding 的顺序是敏感的
            mb.Bindings.Add(b2);
            mb.Bindings.Add(b3);
            mb.Bindings.Add(b4);
            mb.Converter = new LogonMultiBindingConverter();

            // 将Button 与 MultiBinding对象关联
            this.button1.SetBinding(Button.IsEnabledProperty, mb);
        }
    }

    

标签:mb,object,Binding,UI,new,WPF,public
来源: https://www.cnblogs.com/nuan22/p/16416364.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有