天天看点

.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);

            }

        }