zoukankan      html  css  js  c++  java
  • WPF之Binding的使用

    引出:

    在WPF中Binding可以比作数据的桥梁,桥梁的两端分别是Binding的源(Source)和目标(Target)。一般情况下,Binding源是逻辑层对象,Binding目标是UI层的控件对象;这样,数据就会通过Binding送达UI层,被UI层展现。

      首先我们创建一个名为Student的类,这个类的实例作为数据源在UI上显示:  

    复制代码
        public class Student
        {
            private string name;
            public string Name
            {
                set { name = value; }
                get { return name; }
            }
        }
    复制代码

      Binding是一种自动机制,当值变化后属性要有能力通知Binding,让Binding把变化传递给UI元素。怎样才能让一个属性具备这种通知Binding值已经变化的能力呢?方法是在属性的set语句中激发一个PropertyChanged事件。这个事件不需要我们自己声明,我们要做的是让作为数据源的类实现System.ComponentModel名称空间中的INotifyPropertyChanged接口。当为Binding设置了数据源后,Binding就会自动侦听来自这个接口的PropertyChanged事件。  

    复制代码
        public class Student:INotifyPropertyChanged
        {
            private string name;
            public string Name
            {
                set 
                { 
                    name = value;
                    NotifyPropertyChanged("Name");
                }
                get { return name; }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            private void NotifyPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this,new PropertyChangedEventArgs(propertyName));
                }
            }
        }
    复制代码

      当Name属性的值发生变化时PropertyChanged事件就会被激发,Binding接收到这个事件后发现事件的消息告诉它是名为Name的属性发生了值得改变,于是就会通知Binding目标端的UI元素显示新的值。

      XAML代码:  

        <Grid>
            <TextBox x:Name="Box" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="100,50,0,0"  Height="30" Width="200"/>
            <Button Content="按钮"  HorizontalAlignment="Left" VerticalAlignment="Top" Margin="120,150,0,0"  Height="30" Width="160" Click="Button_Click"/>
        </Grid>

      C#代码:  

    复制代码
    public partial class MainWindow : Window
        {
            private Student student;
            public MainWindow()
            {
                InitializeComponent();
                student = new Student();
                Binding binding = new Binding();
                binding.Source = student;
                binding.Path = new PropertyPath("Name");
                BindingOperations.SetBinding(this.Box,TextBox.TextProperty,binding);
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                student.Name = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
            }
        }
    复制代码

      其中:Binding binding=new Binding()声明Binding类型变量并创建实例,然后使用binding.Source=student为Binding实例指定数据源,最后使用binding.Path = new PropertyPath("Name")为Binding指定访问路径。把数据源和目标连接在一起的任务是使用BindingOperations.SetBinding(this.Box,TextBox.TextProperty,binding)方法完成的。

      BindingOperations.SetBinding(this.Box,TextBox.TextProperty,binding)中的参数介绍:

      第一个参数主要是指定Binding的目标。

      第二个参数是用于为Binding指明将数据绑定到目标的那个属性中去,一般都为目标的依赖属性。

      第三个参数是指定那个Binding将数据源与目标关联起来。

      上面的代码还可以简化如下:

            private void SetBinding()
            {
                student = new Student();
                this.Box.SetBinding(TextBox.TextProperty, new Binding("Name") { Source=student});
            }

    Binding的源也就是数据的源头,在日常的工作中,除了使用像上一篇中的Student对象作为数据源外,我们还有更多的选择,比如控件把自己或者自己的容器或子级元素当做源,用一个控件作为另一个控件的数据源等等。

       把控件作为Binding源。  

    复制代码
        <Grid>
            <TextBox x:Name="Box" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="100,50,0,0"  Height="30" Width="200" Text="{Binding Path=Value,ElementName=Silder1,Mode=TwoWay}"/> 
            <Slider x:Name="Silder1" HorizontalAlignment="Left" Margin="100,120,0,0" Maximum="100" Minimum="0"    VerticalAlignment="Top" Width="200"/>
        </Grid>
    复制代码

      其中Text="{Binding Path=Value,ElementName=Silder1,Mode=TwoWay}"等价于C#代码:

      this.Box.SetBinding(TextBox.TextProperty, new Binding("Value") { Source=Silder1});

      或 Binding binding = new Binding() { Path = new PropertyPath("Value"), Source = Silder1 };

        this.Box.SetBinding(TextBox.TextProperty,binding);

      

    深入:

      Binding还支持多级路径(通俗地将就是一路“点”下去)。比如,如果想让一个TextBox显示另外一个TextBox的文本长度,我们可以这么写:

    复制代码
        <Grid>
            <TextBox x:Name="Box" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="100,50,0,0"  Height="30" Width="200" /> 
            <TextBox x:Name="Box2" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="100,123,0,0"  Height="30" Width="200" Text="{Binding Path=Text.Length,ElementName= Box,Mode=OneWay}" />
        </Grid>
    复制代码

    等于C#代码如下:  

      Binding binding = new Binding("Text.Length") { Source=Box,Mode=BindingMode.OneWay};   this.Box2.SetBinding(TextBox.TextProperty,binding);

  • 相关阅读:
    javaweb 乱码总结
    android面试
    如何截取url中的各个参数?
    Spring2.0集成Quartz1.5.2调度框架
    关于使用HttpSessionBindingListener获取在线用户数,同一用户登陆一次
    struts项目中添加的jar包
    日期和时间的正则表达式
    常用的正则表达式
    关于在页面上执行sql语句
    失败的31种原因 程序员们占了几种
  • 原文地址:https://www.cnblogs.com/zy-style/p/3443096.html
Copyright © 2011-2022 走看看