using System; using System.ComponentModel; using System.Diagnostics; using System.Windows.Threading; using System.Windows; namespace WindowsPhone.Recipes.Push.Server.ViewModels { /// /// Base class for all ViewModel classes in the application. /// It provides support for property change notifications /// and has a DisplayName property. This class is abstract. /// public abstract class ViewModelBase : INotifyPropertyChanged { #region Properties public Dispatcher Dispatcher { get { return Application.Current.Dispatcher; } } #endregion #region Constructor protected ViewModelBase() { } #endregion // Constructor #region Debugging /// /// Warns the developer if this object does not have /// a public property with the specified name. This /// method does not exist in a Release build. /// [Conditional("DEBUG")] [DebuggerStepThrough] public void VerifyPropertyName(string propertyName) { // Verify that the property name matches a real, // public, instance property on this object. if (TypeDescriptor.GetProperties(this)[propertyName] == null) { string msg = "Invalid property name: " + propertyName; if (this.ThrowOnInvalidPropertyName) throw new Exception(msg); else Debug.Fail(msg); } } /// /// Returns whether an exception is thrown, or if a Debug.Fail() is used /// when an invalid property name is passed to the VerifyPropertyName method. /// The default value is false, but subclasses used by unit tests might /// override this property's getter to return true. /// protected virtual bool ThrowOnInvalidPropertyName { get; private set; } #endregion // Debugging Aides #region INotifyPropertyChanged Members /// /// Raised when a property on this object has a new value. /// public event PropertyChangedEventHandler PropertyChanged; /// /// Raises this object's PropertyChanged event. /// /// The property that has a new value. protected void NotifyPropertyChanged(string propertyName) { this.VerifyPropertyName(propertyName); PropertyChangedEventHandler handler = this.PropertyChanged; if (handler != null) { var e = new PropertyChangedEventArgs(propertyName); handler(this, e); } } #endregion // INotifyPropertyChanged Members } }