天天看点

.net 4.0及以下版本,MVVM模式ViewModel基类:使用StackTrace实现INotifyPropertyChanged接口

using System;

using System.ComponentModel;

namespace SSMart_Model

{

    public class VModelBase: INotifyPropertyChanged, IDisposable

    {

        public event PropertyChangedEventHandler PropertyChanged;

        public bool IsInDesignMode;

        /// <summary> 显示名称 </summary>

        public virtual string DisplayName { get; protected set; }

        #region 构造

        public VModelBase()

        {

        }

        #endregion

        private void OnPropertyChanged(string propertyName)

        {

            if (this.PropertyChanged != null)

            {

                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

            }

        }

        private static string GetProperyName(string methodName)

        {

            if (methodName.StartsWith("get_") || methodName.StartsWith("set_") ||

                methodName.StartsWith("put_"))

            {

                return methodName.Substring(4);

            }

            throw new Exception(methodName + " not a method of Property");

        }

        protected void SetProperty<T>(ref T name, T value)

        {

            if (object.Equals(name, value)) return;

            name = value;

            string propertyName = GetProperyName(new System.Diagnostics.StackTrace(true).GetFrame(1).GetMethod().Name);

            this.OnPropertyChanged(propertyName);

        }

        #region IDisposable Members

        public void Dispose()

        {

            this.OnDispose();

        }

        /// <summary>

        /// 若支持IDisposable,请重写此方法,当被调用Dispose时会执行此方法。

        /// </summary>

        protected virtual void OnDispose()

        {

        }

        #endregion

    }

}

在其他类中使用:

public string UserPassword

        {

            get

            {

                return userPassword;

            }

            set

            {

                base.SetProperty<string>(ref this.userPassword, value);

            }

        }