C#接口INotifyPropertyChanged使用方法
INotifyPropertyChanged:
該接口包含一個事件, 針對屬性發(fā)生變更時, 執(zhí)行該事件發(fā)生。
// // 摘要: // 通知客戶端屬性值已更改。 public interface INotifyPropertyChanged { // // 摘要: // 在屬性值更改時發(fā)生。 event PropertyChangedEventHandler PropertyChanged; }
接下來, 用一個簡單的示例說明其簡單使用方法(大部分常用的做法演示):
1.定義一個ViewModelBase 繼承INotifyPropertyChanged 接口, 添加一個虛函數(shù)用于繼承子類的屬性進行更改通知
2.MainViewModel中兩個屬性, Code,Name 進行了Set更改時候的調(diào)用通知,
public class ViewModelBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } public class MainViewModel : ViewModelBase { private string name; private string code; public string Name { get { return name; } set { name = value; OnPropertyChanged("Name"); } } public string Code { get { return code; } set { code = value; OnPropertyChanged("Code"); } } }
正如上面的代碼, 應(yīng)該注意到了, 每個屬性調(diào)用OnPropertyChanged的時候, 都需要傳一個自己的屬性名, 這樣是不是很多余?對, 很多余。
改造
看到有些文章給基類的參數(shù)修改為表達式樹, 這樣實現(xiàn)的時候,傳遞一個Lambda表達式, 我覺得這是不治標不治本嗎?如下:
說明: 原來直接傳遞一個固定的string類型實參, 不說換成lambda的性能問題, 同樣帶來的問題你還是固定的需要去書寫這個參數(shù)。 不建議這么做!
CallerMemberName
該類繼承與 Attribute, 不難看出, 該類屬于定義在方法和屬性上的一種特效類, 實現(xiàn)該特性允許獲取方法調(diào)用方的方法或?qū)傩悦Q
// // 摘要: // 允許獲取方法調(diào)用方的方法或?qū)傩悦Q。 [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] public sealed class CallerMemberNameAttribute : Attribute { // // 摘要: // 初始化 System.Runtime.CompilerServices.CallerMemberNameAttribute 類的新實例。 public CallerMemberNameAttribute(); }
改造ViewModelBase:
改造之后, 是不是發(fā)現(xiàn)明顯區(qū)別:
不用傳遞參數(shù), 不用書寫lambda表達式, 也不用擔心其傳遞的參數(shù)安全, 直接根據(jù)讀取屬性名!
到此這篇關(guān)于C#接口INotifyPropertyChanged使用方法的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用C#實現(xiàn)讀取系統(tǒng)配置文件的代碼實例講解
這篇文章主要介紹了使用C#實現(xiàn)讀取系統(tǒng)配置文件的代碼實例,使用到了ConfigurationManager類,需要的朋友可以參考下2015-12-12提權(quán)函數(shù)之RtlAdjustPrivilege()使用說明
RtlAdjustPrivilege() 這玩意是在 NTDLL.DLL 里的一個不為人知的函數(shù),MS沒有公開,原因就是這玩意實在是太NB了,以至于不需要任何其他函數(shù)的幫助,僅憑這一個函數(shù)就可以獲得進程ACL的任意權(quán)限!2011-06-06