在.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. Java HashMap 详解

    HashMap HashMap 继承自 AbstractMap,实现了 Map 接口,基于哈希表实现,元素以键值对的方式存储,允许键和值为 null.因为 key 不允许重复,因此只能有一个键为 nu ...

  2. 【Azure 存储服务】记一次调用Storage Blob API使用 SharedKey Authorization出现的403错误

    问题描述 使用Azure Storag Blob REST API上传文件,用SharedKey作为Authorization出现403错误. 错误消息 b'\xef\xbb\xbf<?xml ...

  3. Jmeter 之正则表达式的使用

    1 背景及用途: html.json数据都可以转化为文本,提供给正则去提取,使用正则可以提取全部数据,这就是正则表达式非常强大的一点. html格式响应更适合用xpath提取,性能比正则好一点 jso ...

  4. 如何使用疯狂URL获取抖音推流码地址(抖音推流码地址获取教程)

    本节所用到的工具:疯狂URL.OBS推流工具 什么是推流地址? 平时我们如果是下载直播,叫拉流.但如果是你自己要直播,属于上传直播流数据,叫推流,即:把直播流数据推送到视频服务器,然后别人才能看到直播 ...

  5. iview 多弹框,显示z-index 不对,被遮挡的解决方案 goTop函数 modal Drawer 抽屉

    iview 多弹框,显示z-index 不对,被遮挡的解决方案 goTop函数 modal 原因 弹多个modal框的时候,会被遮挡,导致后显示的框在下面 解决原理 获取当前弹框的z-index,然后 ...

  6. 使用JdbcTemplate

    1.使用JdbcTemplate的execute()方法执行SQL语句 Java代码  收藏代码 jdbcTemplate.execute("CREATE TABLE USER (user_ ...

  7. Ubuntu14.04 apache2 配置 CGI(并测试:shell,可执行文件,python)

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

  8. 写了个简单爬虫,分析 Boss 直聘自动驾驶岗位

    两年前,朋友想知道 Boss 直聘上关于自动驾驶的岗位有哪些 ,于是,笔者写了一个简单的爬虫 crawler-boss ,将岗位的信息收集起来. 这篇文章,笔者想分享爬虫 crawler-boss 的 ...

  9. 开源一个教学型分库分表示例项目 shardingsphere-jdbc-demo

    在笔者心中,消息队列,缓存,分库分表是高并发解决方案三剑客. 分库分表之所以被广泛使用,因为工程相对简单,但分库分表并不仅仅是分片,还是需要考虑如何扩缩容(全量同步.增量同步.数据校验等). 因此笔者 ...

  10. Loto实践干货(9) 示波器测 晶振

    我们用LOTO示波器的多个型号,带宽从20M到100M,分别测无源和有源晶振的情况.分别测试了12M,15M,24M,48M,80M晶振的波形.并分析了为什么我们经常测出晶振波形不是方波?为什么有时候 ...