提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|其它|编辑:郝浩|2011-03-08 13:38:21.000|阅读 648 次
概述:大家都知道, 在使用 Silverlight 数据绑定的时候, 为了使源对象的更改能够传播到目标,源必须实现 INotifyPropertyChanged 接口。INotifyPropertyChanged 具有 PropertyChanged 事件,该事件通知绑定引擎源已更改,以便绑定引擎可以更新目标值。本文的内容虽然是针对 Silverlight 数据绑定而写的, 对于 WPF 数据绑定也很适用。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
大家都知道, 在使用 Silverlight 数据绑定的时候, 为了使源对象的更改能够传播到目标,源必须实现 INotifyPropertyChanged 接口。INotifyPropertyChanged 具有 PropertyChanged 事件,该事件通知绑定引擎源已更改,以便绑定引擎可以更新目标值。
下面是一个典型的例子:
public class UserModel : INotifyPropertyChanged {
private string _firstName;
private string _lastName;
public string FirstName {
get {
return this._firstName;
}
set {
this._firstName = value;
this.NotifyPropertyChanged("FirstName");
}
}
public string LastName {
get {
return this._lastName;
}
set {
this._lastName = value;
this.NotifyPropertyChanged("LastName");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string propertyName) {
if (this.PropertyChanged != null) {
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
在这个例子中,设置 FirstName 、LastName 时,需要手工激发 PropertyChanged 事件, 通知绑定引擎,因此, 如果数据源中属性比较多的时候, 是比较烦人的, 每个属性的 Setter 都需要激发一下 PropertyChanged 事件, 而且不能使用 C# 自带的自动属性特性。 当然, 可以自己设置一个代码段 snippet 来解决, 但是,重复的激发 PropertyChanged 事件的代码依然存在, 这不是我们的目标。
前段时间看到有人在抱怨 Silverlight 的数据绑定,说必须要实现 INotifyPropertyChanged 接口, 而且还要手工调用 NotifyPropertyChanged 事件等等, 我想说的是, 借助 Castal DynamicProxy 提供的拦截技术,可以把手工调用 NotifyPropertyChanged 事件的代码省掉。
INotifyPropertyChanged 接口是 Silverlight 数据绑定必须的, 这一点我们无法改变。因此需要先创建一个 BaseModel , 并让其实现 INotifyPropertyChanged 接口,代码如下:
public class BaseModel : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName) {
if (this.PropertyChanged != null) {
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
接下来为 BaseModel 写一个拦截器, 让所有继承自 BaseModel 的类在设置属性之后自动激发 NotifyPropertyChanged 事件, 拦截器代码如下:
public class NotifyPropertyChangedInterceptor : StandardInterceptor {
protected override void PostProceed(IInvocation invocation) {
base.PostProceed(invocation);
var methodName = invocation.Method.Name;
// 这里可能不是很完善, 属性的 Setter 一般都是以 set_ 开头的,
// 应该有更好的判断方法。
if (methodName.StartsWith("set_")) {
var propertyName = methodName.Substring(4);
var target = invocation.Proxy as BaseModel;
if (target != null) {
target.NotifyPropertyChanged(propertyName);
}
}
}
}
拦截器的代码很简单, 而且是可以扩展的, 相信都能看懂, 我们还需要一个 ModelHelper , 来方便的创建 Proxy , ModelHelper 的代码如下:
public static class ModelHelper {
private static readonly ProxyGenerator ProxyGenerator = new ProxyGenerator();
private static readonly NotifyPropertyChangedInterceptor Interceptor = new NotifyPropertyChangedInterceptor();
public static T CreateProxy≶T>(T obj) where T : class, INotifyPropertyChanged {
return ProxyGenerator.CreateClassProxyWithTarget(obj, Interceptor);
}
}
有了 ModelHelper , 可以说是万事俱备了, 我们来重写上边的 UserModel , UserModel 最终的代码如下:
public class UserModel : BaseModel {
public virtual string FirstName {
get;
set;
}
public virtual string LastName {
get;
set;
}
}
最后,使用 UserModel 的代码是这样的:
public partial class MainPage : UserControl {
public MainPage() {
InitializeComponent();
// 不能直接使用 UserModel, 要通过 ModelHelper 创建一个 Proxy 才行。
var dataContext = ModelHelper.CreateProxy(new UserModel());
dataContext.FirstName = "Zhang";
dataContext.LastName = "ZhiMin";
this.DataContext = dataContext;
}
}
本文的内容虽然是针对 Silverlight 数据绑定而写的, 对于 WPF 数据绑定也很适用。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
文章转载自:网络转载面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢