WPF中使用CallerMemberName簡(jiǎn)化InotifyPropertyChanged的實(shí)現(xiàn)
在WPF中,當(dāng)我們要使用MVVM的方式綁定一個(gè)普通對(duì)象的屬性時(shí),界面上往往需要獲取到屬性變更的通知,
class NotifyObject : INotifyPropertyChanged { private int number; public int Number { get { return number; } set { number = value; OnPropertyChanged("Number"); } } private string text; public string Text { get { return text; } set { text = value; OnPropertyChanged("Text"); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName = "") { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } }
這么做有一個(gè)比較大的隱患,那就是用了字符串的硬編碼的方式傳遞了屬性名稱,一旦拼寫錯(cuò)誤或因?yàn)橹貥?gòu)代碼忘記去更新這個(gè)字符串時(shí),這樣就會(huì)導(dǎo)致界面上得不到更新。(本身硬編碼的方式來(lái)保證兩者的一致性就是不靠譜的行為)
雖然這本身并不是問(wèn)題,但卻不是很好的實(shí)踐。也有人通過(guò)一些手段來(lái)解決這個(gè)問(wèn)題,有的是通過(guò)表達(dá)式樹(shù),還有的通過(guò)Attribute注入的方式。
從性能上來(lái)講,注入是一個(gè)比較好的方式,但往往引入了比較復(fù)雜的框架。實(shí)際上,在C# 5.0中就引入了一個(gè)調(diào)用方信息的語(yǔ)法方便我們獲取調(diào)用方的函數(shù)名稱和位置,通過(guò)它可以非常簡(jiǎn)單快捷的解決上面的這個(gè)問(wèn)題:
class NotifyObject : INotifyPropertyChanged { private int number; public int Number { get { return number; } set { number = value; OnPropertyChanged(); } } private string text; public string Text { get { return text; } set { text = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName]string propertyName = "") { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } }
代碼很簡(jiǎn)單,這里就不多介紹了。
更進(jìn)一步
有的時(shí)候,為了減少通知的頻率,往往會(huì)把通知寫出如下形式:
private int number; public int Number { get { return number; } set { if (number == value) return; number = value; OnPropertyChanged(); } } private string text; public string Text { get { return text; } set { if (text == value) return; text = value; OnPropertyChanged(); } }
這種寫法非常單調(diào),并且在屬性多的時(shí)候代碼就顯得很累贅了。這里我就寫了一個(gè)通用點(diǎn)的函數(shù)把他們統(tǒng)一起來(lái),下次就可以直接用了。
private int number; public int Number { get { return number; } set { UpdateProper(ref number, value); } } private string text; public string Text { get { return text; } set { UpdateProper(ref text, value); } } protected void UpdateProper<T>(ref T properValue, T newValue, [CallerMemberName] string properName = "") { if (object.Equals(properValue, newValue)) return; properValue = newValue; OnPropertyChanged(properName); }
由于C#的語(yǔ)法限制,不能在類外部調(diào)用event,因此不能寫成擴(kuò)展方法,這里就簡(jiǎn)單的寫成一個(gè)對(duì)象,下次就直接照著改好了:
class NotifyObject : INotifyPropertyChanged { private int number; public int Number { get { return number; } set { UpdateProper(ref number, value); } } private string text; public string Text { get { return text; } set { UpdateProper(ref text, value); } } protected void UpdateProper<T>(ref T properValue, T newValue, [CallerMemberName] string properName = "") { if (object.Equals(properValue, newValue)) return; properValue = newValue; OnPropertyChanged(properName); } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName]string propertyName = "") { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } }
到此這篇關(guān)于WPF中使用CallerMemberName簡(jiǎn)化InotifyPropertyChanged的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#使用LINQ中Enumerable類方法的延遲與立即執(zhí)行的控制
這篇文章主要介紹了C#的LINQ查詢中Enumerable類方法的延遲與立即執(zhí)行,LINQ語(yǔ)言集成查詢可以讓C#和VB以查詢數(shù)據(jù)庫(kù)相同的方式操作內(nèi)存數(shù)據(jù),需要的朋友可以參考下2016-03-03詳解C#批量插入數(shù)據(jù)到Sqlserver中的四種方式
本文主要講解一下在Sqlserver中批量插入數(shù)據(jù)。文中大數(shù)據(jù)批量插入方式一和方式四盡量避免使用,而方式二和方式三都是非常高效的批量插入數(shù)據(jù)方式,需要的朋友可以看下2016-12-12C#編程實(shí)現(xiàn)連接ACCESS數(shù)據(jù)庫(kù)實(shí)例詳解
這篇文章主要介紹了C#編程實(shí)現(xiàn)連接ACCESS數(shù)據(jù)庫(kù)的方法,以實(shí)例形式較為詳細(xì)的分析了C#連接access數(shù)據(jù)庫(kù)的具體步驟與相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11