在.NET平台上,数据绑定是一项令人十分愉快的技术。利用数据绑定能减少代码,简化控制逻辑。

通常,可以将某个对象的一个属性绑定到一个可视化的控件上,当属性值改变时,控件上的显示数据也随之发生变化。要实现这一功能,只需要为自定义对象实现 INotifyPropertyChanged 接口即可。此接口中定义了 PropertyChanged 事件,我们只需在属性值改变时触发该事件即可。下面的例子说明如何绑定如何自定义可用于数据绑定的对象:

假设我们有自定义对象 CustomizedObject 和窗体上的 Label 控件 label1,想要将 CustomizedObject 的 Date 属性和 label1.Text 关联起来,Date 属性值会在程序运行过程当中发生变化(例如点击 Button 控件 button1),并且直接反映在 label1.Text 上。下面的代码可以实现上述功能:

using System;

using System.ComponentModel;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

private CustomizedObject myObject;

public Form1()

{

InitializeComponent();

// 初始化CustomizedObject对象

myObject = new CustomizedObject { Date = DateTime.Now };

// 绑定对象的属性到label1

label1.DataBindings.Add("Text", myObject, "Date");

}

private void button1_Click(object sender, EventArgs e)

{

// 点击按钮改变对象的属性值

myObject.Date = myObject.Date.AddDays(1);

}

}

// 自定义对象 CustomizedObject 并实现 INotifyPropertyChanged 接口

public class CustomizedObject : INotifyPropertyChanged

{

private DateTime dateValue;

// 自定义一个 Date 属性

public DateTime Date

{

get { return dateValue; }

set

{

dateValue = value;

NotifyPropertyChanged("Date");

}

}

#region INotifyPropertyChanged Members

public event PropertyChangedEventHandler PropertyChanged;

// 添加一个触发 PropertyChanged 事件的通用方法

protected virtual void NotifyPropertyChanged(string propertyName)

{

if (PropertyChanged != null)

{

PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

}

}

#endregion

}

}

其实从上面的例子中可以学习到如何自定义事件,这在开发控件时十分有用且非常重要。通过观察 INotifyPropertyChanged 接口可以知道它内部有一个成员,那就是:

event PropertyChangedEventHandler PropertyChanged;

而其中的 PropertyChangedEventHandler 实质上是一个委托,明白了这一点就可以自定义事件了。

现在,开始为 Form1 自定义事件 DateChanged (事件一般是定义在控件或组件中的,这里只是为了说明其过程而没有重新定义一个控件),首先需要一个事件参数类型:

public class DateChangedEventArgs : EventArgs

{

public DateTime OldValue { get; set; }

public DateTime NewValue { get; set; }

}

声明一个事件处理委托

public delegate void DateChangedHandler(object sender, DateChangedEventArgs e);

我们可以将事件直接添加到Form1的定义中,但有时为了代码的通用性,可以将事件封装到一个接口中,例如:

public interface IDateChanged

{

event DateChangedHandler DateChanged;

}

然后我们为Form1实现 IDateChanged 接口,并在button1点击时触发该事件。以下是完整代码:

using System;

using System.ComponentModel;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

public partial class Form1 : Form, IDateChanged

{

private CustomizedObject myObject;

public Form1()

{

InitializeComponent();

// 初始化CustomizedObject对象

myObject = new CustomizedObject { Date = DateTime.Now };

// 绑定对象的属性到label1

label1.DataBindings.Add("Text", myObject, "Date");

// 添加 DateChanged 事件的处理逻辑

this.DateChanged += new DateChangedHandler(Form1_DateChanged);

}

private void Form1_DateChanged(object sender, DateChangedEventArgs e)

{

string message = string.Format(

"DateChanged event triggered!nOldValue: {0}nNew Value: {1}",

e.OldValue,

e.NewValue);

MessageBox.Show(message);

}

private void button1_Click(object sender, EventArgs e)

{

// 点击按钮改变对象的属性值并触发 DateChanged 事件

DateChangedEventArgs ev = new DateChangedEventArgs

{

OldValue = myObject.Date,

NewValue = myObject.Date.AddDays(1)

};

myObject.Date = ev.NewValue;

DateChangedMethod(ev);

}

#region IDateChanged Members

public event DateChangedHandler DateChanged;

// 添加一个触发 DateChanged 事件的通用方法

protected virtual void DateChangedMethod(DateChangedEventArgs e)

{

if (DateChanged != null)

{

DateChanged(this, e);

}

}

#endregion

}

// 自定义对象 CustomizedObject 并实现 INotifyPropertyChanged 和 IDateChanged 接口

public class CustomizedObject : INotifyPropertyChanged

{

private DateTime dateValue;

// 自定义一个 Date 属性

public DateTime Date

{

get { return dateValue; }

set

{

dateValue = value;

NotifyPropertyChanged("Date");

}

}

#region INotifyPropertyChanged Members

public event PropertyChangedEventHandler PropertyChanged;

// 添加一个触发 PropertyChanged 事件的通用方法

protected virtual void NotifyPropertyChanged(string propertyName)

{

if (PropertyChanged != null)

{

PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

}

}

#endregion

}

// DateChanged 事件委托

public delegate void DateChangedHandler(object sender, DateChangedEventArgs e);

// 用于封装事件的接口

public interface IDateChanged

{

event DateChangedHandler DateChanged;

}

// DateChanged 事件参数

public class DateChangedEventArgs : EventArgs

{

public DateTime OldValue { get; set; }

public DateTime NewValue { get; set; }

}

}

扩展:https://www.codeprj.com/blog/50888a1.html

C# PropertyChanged 事件-数据绑定的更多相关文章

  1. INotifyPropertyChanged接口的PropertyChanged 事件

    INotifyPropertyChanged 接口用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通知. 例如,考虑一个带有名为 FirstName 属性的 Person 对象. 若要提供 ...

  2. WPF当属性值改变时利用PropertyChanged事件来加载动画

    在我们的程序中,有时我们需要当绑定到UI界面上的属性值发生变化从而引起数据更新的时候能够加载一些动画,从而使数据更新的效果更佳绚丽,在我们的程序中尽量将动画作为一种资源放在xaml中,而不是在后台中通 ...

  3. 微信小程序tips集合:无法输入文字/随时查看页面/元素审查/点击事件/数据绑定

    1:编辑文档无法输入文字 出现这种情况一般是因为之前编辑的文档未保存,所有在其他文档输入的时候会自动输入到未保存的文档中,在文档暂时编辑完毕后要ctrl+s随手保存,不然会出现无法打字情况 2: 随时 ...

  4. MVVM模式和在WPF中的实现(二)数据绑定

    MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  5. WPF入门:数据绑定

    上一篇我们将XAML大概做了个了解 ,这篇将继续学习WPF数据绑定的相关内容 数据源与控件的Binding Binding作为数据传送UI的通道,通过INotityPropertyChanged接口的 ...

  6. Windows Phone 十、数据绑定

    数据绑定:是一种 XAML 和后台数据交互的方式(桥梁) 通过后台进行数据绑定 <Grid> <TextBox x:Name="txtHello" Text=&q ...

  7. silverlight简单数据绑定3

    3种数据绑定模式  OneTime(一次绑定) OneWay(单项绑定) TwoWay(双向绑定) OneTime:仅在数据绑定创建时使用数据源更新目标. 列子: 第一步,创建数据源对象让Person ...

  8. WPF 数据绑定Bingding基础(第四天)

    程序的本质是数据加算法.数据会在存储.逻辑和展示三个层面沟通,在WPF中,展示层和逻辑层的沟通就使用Data Bingding来实现. Binding即“绑定”,如果把Bingding比作数据的桥梁, ...

  9. WPF笔记(1.6 数据绑定)——Hello,WPF!

    原文:WPF笔记(1.6 数据绑定)--Hello,WPF! 这个一节都是在讲一个数据绑定的示例.功用:输入姓和名,点击Add按钮,ListBox增加一条记录,永远是字符串“name: nick”:L ...

  10. Windows Phone 8初学者开发—第10部分:数据绑定应用程序和透视应用程序项目模板简介

    原文 Windows Phone 8初学者开发—第10部分:数据绑定应用程序和透视应用程序项目模板简介 原文地址: http://channel9.msdn.com/Series/Windows-Ph ...

随机推荐

  1. MySQL 数据库死锁排查

    死锁排查方法 查看进程状态 show processlist; 查看行锁的状态 show status like 'InnoDB_row_lock%'; 查询是否有死锁 show engine inn ...

  2. 【Azure 存储服务】使用PowerShell脚本创建存储账号(Storage Account)的共享访问签名(SASToken) : New-AzStorageContainerSASToken

    问题描述 使用PowerShell脚本如何来创建存储账号(Storage Account)的共享访问签名呢?查询到可以使用 New-AzStorageContainerSASToken 命令来生成Az ...

  3. Autofac入门与替代ASP.NET Core、ABP依赖注入容器

    目录 Autofac 的使用 1,简单的实践 2,注册组件 3,Lambda 注册组件 4,注册泛型 5,属性注入 6,解析服务 7,生命周期 8,实例作用域 9,Autofac 其它需要学习的知识 ...

  4. 酷睿i5与i7处理器有什么区别

    本文将深入解析酷睿i5与i7处理器的区别,帮助您做出明智的购买决策.购买笔记本之前,了解处理器相关知识至关重要. 处理器作为电脑的核心部件,其性能直接影响整机运行速度和效率. 市面上主流的笔记本处理器 ...

  5. OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像

    前言   通过相机图片可以识别出棋盘角点了,这时候我们需要通过角点去计算相机内参矩阵,通过上篇得知畸变的原理,所以我们尽可能要全方位都能获取标定图片,全方位意思是提供的多张图综合起来基本覆盖了相机所有 ...

  6. 摆脱鼠标系列 - vscode 花括号 开始结束 间的跳转 Ctrl + Shift + \

    为什么 摆脱鼠标系列 - vscode 花括号 开始结束 间的跳转 Ctrl + Shift + \ 快速移动到下一个 注意有时候输入法会有问题 因为 Ctrl + Shift 是切换输入法,所以回头 ...

  7. idea 暂存 Stash Changes Git/Repository/Stash Changes 恢复暂存 UnStash Changes

    idea 暂存 Stash Changes Git/Repository/Stash Changes 恢复暂存 UnStash Changes git stash save "save me ...

  8. SqlServer复制和订阅(实现主从同步)

    SqlServer复制和订阅 注意: 1.登录必须是服务器名称不能是ip 2.订阅服务器不需要提前创建数据库 复制 1.展开要发布的数据库节点,找到复制下的本地发布 2.右击本地发布,选择本地发布 3 ...

  9. linux kernel 中进程间描述符的传递方法及原理

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  10. 广西首次!3DCAT实时云渲染助力南宁数字气象科普馆上线

    11月17日,南宁市气象局举行数字气象科普馆上线发布仪式.目前,以气象为主题的三维虚拟数字气象科普馆在广西尚属首创.17日起,在微信搜索小程序南宁气象科普馆&就能在3DCAT实时云渲染技术助力 ...