C# PropertyChanged 事件-数据绑定
在.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 事件-数据绑定的更多相关文章
- INotifyPropertyChanged接口的PropertyChanged 事件
INotifyPropertyChanged 接口用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通知. 例如,考虑一个带有名为 FirstName 属性的 Person 对象. 若要提供 ...
- WPF当属性值改变时利用PropertyChanged事件来加载动画
在我们的程序中,有时我们需要当绑定到UI界面上的属性值发生变化从而引起数据更新的时候能够加载一些动画,从而使数据更新的效果更佳绚丽,在我们的程序中尽量将动画作为一种资源放在xaml中,而不是在后台中通 ...
- 微信小程序tips集合:无法输入文字/随时查看页面/元素审查/点击事件/数据绑定
1:编辑文档无法输入文字 出现这种情况一般是因为之前编辑的文档未保存,所有在其他文档输入的时候会自动输入到未保存的文档中,在文档暂时编辑完毕后要ctrl+s随手保存,不然会出现无法打字情况 2: 随时 ...
- MVVM模式和在WPF中的实现(二)数据绑定
MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- WPF入门:数据绑定
上一篇我们将XAML大概做了个了解 ,这篇将继续学习WPF数据绑定的相关内容 数据源与控件的Binding Binding作为数据传送UI的通道,通过INotityPropertyChanged接口的 ...
- Windows Phone 十、数据绑定
数据绑定:是一种 XAML 和后台数据交互的方式(桥梁) 通过后台进行数据绑定 <Grid> <TextBox x:Name="txtHello" Text=&q ...
- silverlight简单数据绑定3
3种数据绑定模式 OneTime(一次绑定) OneWay(单项绑定) TwoWay(双向绑定) OneTime:仅在数据绑定创建时使用数据源更新目标. 列子: 第一步,创建数据源对象让Person ...
- WPF 数据绑定Bingding基础(第四天)
程序的本质是数据加算法.数据会在存储.逻辑和展示三个层面沟通,在WPF中,展示层和逻辑层的沟通就使用Data Bingding来实现. Binding即“绑定”,如果把Bingding比作数据的桥梁, ...
- WPF笔记(1.6 数据绑定)——Hello,WPF!
原文:WPF笔记(1.6 数据绑定)--Hello,WPF! 这个一节都是在讲一个数据绑定的示例.功用:输入姓和名,点击Add按钮,ListBox增加一条记录,永远是字符串“name: nick”:L ...
- Windows Phone 8初学者开发—第10部分:数据绑定应用程序和透视应用程序项目模板简介
原文 Windows Phone 8初学者开发—第10部分:数据绑定应用程序和透视应用程序项目模板简介 原文地址: http://channel9.msdn.com/Series/Windows-Ph ...
随机推荐
- 【LeetCode回溯算法#02】组合总和III
组合总和III 力扣题目链接(opens new window) 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字 ...
- Python函数每日一讲 - 一文让你彻底掌握Python中的frozenset函数
引言 在 Python 中,frozenset() 函数是一个重要的工具,用于创建不可变的集合对象.本文将介绍 frozenset() 函数的语法.用法示例以及实际应用场景,帮助大家更好地理解和应用这 ...
- HashMap源码窥探
目录 前言 HashMap的数据结构 HashMap的put方法 HashMap的get方法 HashMap的初始化 HashMap的containsKey方法 HashMap的putAll方法 Ha ...
- 【教程】navicat配合HTTP通道远程连接SQLite数据库
前言 缘由 好奇的我想查看服务器上宝塔面板的SQLite数据库 久别一月,特来水文.起因是我看到服务器上搭建的宝塔面板,好奇其中使用的SQLite数据库,想用navicat远程连接看一下,奈何不会玩, ...
- 【思维题、KMP】P3526 [POI2011]OKR-Periodicity 题解
P3526 [POI2011]OKR-Periodicity 题解 前言 一道非常厉害的思维题.看题解得到了一些提示搞出来了. 作为 2011 年的题还是很厉害的. 约定 定义 \(s[l,r]\) ...
- 辨析Java与网络通信中的编码与解码
在Java字符流上下文中的编码和解码,以及在网络通信中的编码概念. 在Java中,当我们谈论字符流(如Reader和Writer)时,编码和解码主要涉及将字符数据转换为字节数据,以及将字节数据转换回字 ...
- .Net Core中使用DiagnosticSource进行日志记录
System.Diagnostics.DiagnosticSource 是一个可以对代码进行检测的模块,可以丰富地记录程序中地日志,包括可序列化的类型(例如 HttpResponseMessage 或 ...
- jsp相对路径绝对路径
jsp相对路径绝对路径 很长一段时间纠结过JSP中的相对路径和绝对路径,也研究过一段时间,今天趁着有点时间,记下来,也有大家分享一下. 1)我们先来理解一下相对路径 首先还是我们的开始,建一个WEB项 ...
- Wireshark在多媒体开发中的使用
一 概要: Wireshark(前称Ethereal)是一个网络抓包工具. 是一款非常棒的Unix和Windows上的开源 网络协议分析器.尽可能显示出最为详细的网络封包资料.Wireshark使用W ...
- echo: nice day
乐开花了,echo 姑娘,很合我的胃口,活泼.俏皮.专业.三观出乎的齐,第一次遇见这种默契度如此高的,你说半句我懂,我说半句你懂,太完美了,以前感觉和女生沟通太累,聊几句就 game over,我这是 ...