您好,登錄后才能下訂單哦!
這篇文章主要介紹“WPF中如何使用CallerMemberName簡化InotifyPropertyChanged”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“WPF中如何使用CallerMemberName簡化InotifyPropertyChanged”文章能幫助大家解決問題。
在WPF中,當我們要使用MVVM的方式綁定一個普通對象的屬性時,界面上往往需要獲取到屬性變更的通知,
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)); } } }
這么做有一個比較大的隱患,那就是用了字符串的硬編碼的方式傳遞了屬性名稱,一旦拼寫錯誤或因為重構代碼忘記去更新這個字符串時,這樣就會導致界面上得不到更新。(本身硬編碼的方式來保證兩者的一致性就是不靠譜的行為)
雖然這本身并不是問題,但卻不是很好的實踐。也有人通過一些手段來解決這個問題,有的是通過表達式樹,還有的通過Attribute注入的方式。
從性能上來講,注入是一個比較好的方式,但往往引入了比較復雜的框架。實際上,在C# 5.0中就引入了一個調用方信息的語法方便我們獲取調用方的函數名稱和位置,通過它可以非常簡單快捷的解決上面的這個問題:
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)); } } }
代碼很簡單,這里就不多介紹了。
有的時候,為了減少通知的頻率,往往會把通知寫出如下形式:
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(); } }
這種寫法非常單調,并且在屬性多的時候代碼就顯得很累贅了。這里我就寫了一個通用點的函數把他們統一起來,下次就可以直接用了。
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#的語法限制,不能在類外部調用event,因此不能寫成擴展方法,這里就簡單的寫成一個對象,下次就直接照著改好了:
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)); } } }
關于“WPF中如何使用CallerMemberName簡化InotifyPropertyChanged”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。