日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

使用 Castal DynamicProxy 简化 Silverlight 数据绑定

發(fā)布時(shí)間:2025/3/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 Castal DynamicProxy 简化 Silverlight 数据绑定 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大家都知道, 在使用 Silverlight 數(shù)據(jù)綁定的時(shí)候, 為了使源對(duì)象的更改能夠傳播到目標(biāo),源必須實(shí)現(xiàn) INotifyPropertyChanged 接口。INotifyPropertyChanged 具有 PropertyChanged 事件,該事件通知綁定引擎源已更改,以便綁定引擎可以更新目標(biāo)值。

下面是一個(gè)典型的例子:

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));}} }

在這個(gè)例子中,設(shè)置 FirstName 、LastName 時(shí),需要手工激發(fā) PropertyChanged 事件, 通知綁定引擎,因此, 如果數(shù)據(jù)源中屬性比較多的時(shí)候, 是比較煩人的, 每個(gè)屬性的 Setter 都需要激發(fā)一下 PropertyChanged 事件, 而且不能使用 C#? 自帶的自動(dòng)屬性特性。 當(dāng)然, 可以自己設(shè)置一個(gè)代碼段 snippet? 來(lái)解決, 但是,重復(fù)的激發(fā) PropertyChanged 事件的代碼依然存在, 這不是我們的目標(biāo)。

前段時(shí)間看到有人在抱怨 Silverlight 的數(shù)據(jù)綁定,說(shuō)必須要實(shí)現(xiàn) INotifyPropertyChanged 接口, 而且還要手工調(diào)用 NotifyPropertyChanged 事件等等, 我想說(shuō)的是, 借助 Castal DynamicProxy 提供的攔截技術(shù),可以把手工調(diào)用 NotifyPropertyChanged 事件的代碼省掉。

INotifyPropertyChanged 接口是 Silverlight 數(shù)據(jù)綁定必須的, 這一點(diǎn)我們無(wú)法改變。因此需要先創(chuàng)建一個(gè) BaseModel , 并讓其實(shí)現(xiàn) INotifyPropertyChanged 接口,代碼如下:

public class BaseModel : INotifyPropertyChanged {public event PropertyChangedEventHandler PropertyChanged;public void NotifyPropertyChanged(string propertyName) {if (this.PropertyChanged != null) {this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));}} }

接下來(lái)為 BaseModel 寫(xiě)一個(gè)攔截器, 讓所有繼承自 BaseModel 的類(lèi)在設(shè)置屬性之后自動(dòng)激發(fā) NotifyPropertyChanged 事件, 攔截器代碼如下:

public class NotifyPropertyChangedInterceptor : StandardInterceptor {protected override void PostProceed(IInvocation invocation) {base.PostProceed(invocation);var methodName = invocation.Method.Name;// 這里可能不是很完善, 屬性的 Setter 一般都是以 set_ 開(kāi)頭的,// 應(yīng)該有更好的判斷方法。if (methodName.StartsWith("set_")) {var propertyName = methodName.Substring(4);var target = invocation.Proxy as BaseModel;if (target != null) {target.NotifyPropertyChanged(propertyName);}}} }

攔截器的代碼很簡(jiǎn)單, 而且是可以擴(kuò)展的, 相信都能看懂, 我們還需要一個(gè) ModelHelper , 來(lái)方便的創(chuàng)建 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 , 可以說(shuō)是萬(wàn)事俱備了, 我們來(lái)重寫(xiě)上邊的 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, 要通過(guò) ModelHelper 創(chuàng)建一個(gè) Proxy 才行。var dataContext = ModelHelper.CreateProxy(new UserModel());dataContext.FirstName = "Zhang";dataContext.LastName = "ZhiMin";this.DataContext = dataContext;} }

我們不能改變環(huán)境, 但是可以改變自己, 因此,我們應(yīng)該多一些思考,少一些抱怨。

本文的內(nèi)容雖然是針對(duì) Silverlight 數(shù)據(jù)綁定而寫(xiě)的, 對(duì)于 WPF 數(shù)據(jù)綁定也很適用。

總結(jié)

以上是生活随笔為你收集整理的使用 Castal DynamicProxy 简化 Silverlight 数据绑定的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。