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
}
}