WPF INotifyPropertyChanged


首先感嘆一下,INotifyPropertyChanged這個單詞有點長,我現在都還記不住……

其次再感嘆一下,實現這個接口,屬性的封裝還是有點麻煩啊。

屬性什么的我就喜歡 xxx{get;set;}……不得不說我是一個很懶的猿~

首先來看看一般的實現方式:

    public class NotificationObject : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// 實現依賴屬性
        /// </summary>
        /// <param name="propertyName"></param>
        public void RaisePropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        private string _userName;
        //private const string UserNameProperty="UserName";
        public string UserName
        {
            get { return _userName; }
            set
            {
                _userName= value;
                this.RaisePropertyChanged("UserName");//這樣的寫法是不是很不爽? 或者this.RaisePropertyChanged(UserNameProperty)
                }
          } 
    
 
    }
View Code


對於以上的寫法,實在有點不爽,不寫const字段吧,比較容易填錯,寫了吧,哎呀好費事兒啊。

很幸運的是不僅是我覺得麻煩,有大神已經給出了解決之道:(很抱歉,忘記是哪位大神的文章了,剛剛翻了一下沒找到,這里就直接上代碼了)

    public static class NotificationObjectEx
    {
        /// <summary>
        /// 使用:RaisePropertyChanged(vm=>vm.屬性)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="TProperty"></typeparam>
        /// <param name="propertyChangedBase"></param>
        /// <param name="expression"></param>
        public static void RaisePropertyChanged<T, TProperty>(this T propertyChangedBase, Expression<Func<T, TProperty>> expression) where T : NotificationObject
        {
            var memberExpression = expression.Body as MemberExpression;
            if (memberExpression != null)
            {
                string propertyName = memberExpression.Member.Name;
                propertyChangedBase.RaisePropertyChanged(propertyName);
            }
            else
                throw new NotImplementedException();
        }
    }
View Code

於是就可以這樣:this.RaisePropertyChanged(vm=>vm.UserName); 是不是覺得爽多了?麻麻再也不用擔心哦拼錯屬性名稱了~

 

最后,好記性不如爛筆頭~~INotifyPropertyChanged、INotifyPropertyChanged、INotifyPropertyChanged、INotifyPropertyChanged、INotifyPropertyChanged……


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM