1. 程式人生 > >.net 4.5版本MVVM模式下ViewModel基類:使用CallerMemberName優雅實現INotifyPropertyChanged介面

.net 4.5版本MVVM模式下ViewModel基類:使用CallerMemberName優雅實現INotifyPropertyChanged介面

using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics;

namespace SSMart_Model {     /// <summary>     /// Provides common functionality for ViewModel classes     /// </summary>     public abstract class ViewModelBase : INotifyPropertyChanged, IDisposable     {

        private Dictionary<string, object> dict = new Dictionary<string, object>();

        private static string GetProperyName(string methodName)         {             if (methodName.StartsWith("get_") || methodName.StartsWith("set_") ||                 methodName.StartsWith("put_"))             {                 return methodName.Substring("get_".Length);             }             throw new Exception(methodName + " not a method of Property");         }         protected void SetValue(object value)         {             string propertyName = GetProperyName(new StackTrace(true).GetFrame(1).GetMethod().Name);             dict[propertyName] = value;             if (PropertyChanged != null)             {                 PropertyChanged(this, new PropertyChangedEventArgs(propertyName));             }         }

        protected object GetValue()         {             string propertyName = GetProperyName(new StackTrace(true).GetFrame(1).GetMethod().Name);             if (dict.ContainsKey(propertyName))             {                 return dict[propertyName];             }             else             {                 return null;             }         }

        public virtual string DisplayName { get; set; }

        protected void UpdateProper<T>(ref T properValue, T newValue, [CallerMemberName] string properName = "")         {             if (object.Equals(properValue, newValue))                 return;

            properValue = newValue;             OnPropertyChanged(properName);         }         /// <summary>         /// 屬性改變時,呼叫該方法發出通知         /// </summary>         public event PropertyChangedEventHandler PropertyChanged;         protected void OnPropertyChanged([CallerMemberName]string propertyName = "")         {

            if (PropertyChanged != null)             {                 PropertyChanged(this, new PropertyChangedEventArgs(propertyName));             }         }

        #region IDisposable Members

        public void Dispose()         {             this.OnDispose();         }         //這裡的引數表示是否需要釋放那些實現IDisposable介面的託管物件         protected virtual void OnDispose()         {

        }

        #endregion     } }

在其他類中使用如下;

public string UserName         {             get             {                 return userName;             }             set             {                                  UpdateProper(ref userName, value);

            }         }