深入浅出WPF之Binding的使用(一)_aidem_brown的博客-程序员宝宝

技术标签: xaml  binding  WPF  wpf  

from:   http://www.cnblogs.com/akwwl/p/3421005.html


在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模型如下:



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aidem_brown/article/details/76222081

智能推荐

webpack多页面教你轻松打造一个vue项目同时跑出pc端和h5端_北极那企鹅丶的博客-程序员宝宝

写在前面的话 &nbsp;&nbsp;最近接到一个官网项目,有pc和h5两端,想着又要新开两个项目,一个放pc,一个放h5,然后发布的时候又要分开,不由得头大,忽然想起webpack不是有多页面嘛,干嘛不一个项目一个pc端页面,一个h5端页面,然后像图片资源,公共方法等等之类的不就可以共用了嘛,发布的时候也只需要打包一个就可以啦...

SpringBoot整合springSession解决session共享问题_Mac maxwell的博客-程序员宝宝

1).引入spring-boot-starter-data-redis&lt;!--整合springSession解决session共享问题--&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.session&lt;/groupId&gt; &lt;artifactId&gt;spring-session-data-redis&lt;/artifactId&gt;

dbcp2配置参数不生效导致的请求阻塞_程序员劝退师·咩的博客-程序员宝宝_dbcp2

数据库配置不生效,数据库请求阻塞,dbcp2连接池资源耗尽

Linux设备树DTB存储格式_DylanHe215的博客-程序员宝宝

文章目录DTB存储格式DTB数据结构struct ftd_header区域数据结构memory reservation block区域数据结构struct block区域strings blockDTB存储格式头部(struct ftd_header):用来表明各个部分的偏移地址,整个文件的大小,版本号等等;内存的保留信息块(memory reservation block):存放dts文件中申明的需要预留的内存的信息;节点块(structure block):各个节点的信息将放在structu

c++基础 | stuck_Way798的博客-程序员宝宝

文章目录stack 对象的默认构造stack 的 push() 与 pop() 方法stack 对象的拷贝构造与赋值stack 的数据存取stack 的大小stuck简介:stack 是堆栈容器,是一种“先进后出”的容器。stack 是简单地装饰 deque 容器而成为另外的一种容器。#include stack 对象的默认构造// stack 采用模板类实现, stack 对象的默认构造形式: stack &lt;T&gt; stkT; stack &lt;int&gt; stkI

LeetCode:34. 在排序数组中查找元素的第一个和最后一个位置_flamingobaby的博客-程序员宝宝

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是O(log n) 级别。如果数组中不存在目标值,返回[-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例2:输入: nums = [5,7,7,8,8,1...

随便推点

CCF CSP刷题记录11——201512-2消除类游戏(Java)_I have a lemon的博客-程序员宝宝

试题编号: 201512-2 试题名称: 消除类游戏 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地方的棋子将同时被消除。   现在给你一个n行m列的棋盘,棋盘中的每一个方格上有一个棋子,请给

【Java源码解析】如何严谨地重写 equals 方法、getClass 方法与 instanceof 关键词用法比较_Zhou_LC的博客-程序员宝宝

文章目录如何严谨地重写 equals 方法1 equals 方法概述2 String 类中的 equals 方法3 自定义 equals 方法时出现的问题4 instanceof 关键词与 getClass 方法的比较5 正确编写 equals 方法如何严谨地重写 equals 方法1 equals 方法概述equals 方法我们都非常熟悉,equals 是 Object 基类中的模板方法 ,每个类中都有它的的存在,多数类或其抽象父类都以不同方式重写了 equals 方法。例如,作为所有数值封装类的

Unsafe_yangmengjiao_的博客-程序员宝宝_unsafe分配内存

一、简介Unsafe类提供了硬件级别的原子操作,主要提供了以下功能:1、通过Unsafe类可以分配内存,可以释放内存类中提供的3个本地方法allocateMemory、reallocateMemory、freeMemory分别用于分配内存,扩充内存和释放内存。2、可以定位对象某字段的内存位置,也可以修改对象的字段值,即使它是私有的字段的定位:JAVA中对象的字段的定位可能通过staticFieldOffset方法实现,该方法返回给定field的内存...

android adb打开gps,adb 命令行模拟GPS位置信息_古筝圈小透明的博客-程序员宝宝

查看模拟器序列号&gt;adb devicesList of devices attached deviceemulator-5554然后用adb emu命令执行设备的console命令geo fix&gt;adb -s emulator-5554 emu geo fix 121.49612 31.24010参考:http://code.metager.de/source/xref/android...

2.关于RT-Thread 移植SPI NRF24L01_☆摔得流行★的博客-程序员宝宝

一、描述我默认你有良好的基础,使用过RT-Thread Studio、CubeMX等软件开发程序,所以文章只会讲解细节,毕竟时代在变化。对于NRF24L01,作为从机与stm32使用SPI协议进行通信,你得先了解写SPI协议,什么是CPOL、CPHA,配置他们有什么用,推荐看下原子哥视频,简单,速度快,最好标准库3.5裸机也写下程序,了解下结构体对相关寄存器的配置,毕竟使用CubeMX或IDE配置实在是太简单了,当然也忘得快。当然你想速成也可以。二、CubeMX或CubeIDE配置程序

推荐文章

热门文章

相关标签