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