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