博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF之Binding的使用
阅读量:6254 次
发布时间:2019-06-22

本文共 3336 字,大约阅读时间需要 11 分钟。

引出:

在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代码:  

  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源。  

  其中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的文本长度,我们可以这么写:

等于C#代码如下:  

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

 

转载于:https://www.cnblogs.com/zy-style/p/3443096.html

你可能感兴趣的文章
DC之间的时间同步及组策略时间同步
查看>>
巅峰对决:水立方 即将上演3D版星际电竞
查看>>
网站需求量很大,服务器优化的tips
查看>>
Android EditText OnTouchListener事件重复
查看>>
单台centos机器启动多个vsftpd服务
查看>>
zabbix监控kafka
查看>>
谈谈linux2.6内核的驱动框架
查看>>
javascript节点的汇总
查看>>
windows计算机名大小写
查看>>
【JAVA】保龄球记分游戏
查看>>
mysql kernel: nf_conntrack version 0.5.0
查看>>
NFS网络文件共享服务的配置和排错总结
查看>>
Android 触摸及手势操作GestureDetector
查看>>
Win2003 AD迁移至Win2008 R2 AD 1
查看>>
ora-01200错误的分析
查看>>
Hyper-V 3 虚拟机快照之二 创建和查看快照
查看>>
2.[Struts2权威指南笔记]Servlet
查看>>
django model 多对多查询
查看>>
Android+TensorFlow+CNN+MNIST实现手写数字识别
查看>>
SCCM 2012系列11 补丁分发下
查看>>