using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ComponentModel; using System.Diagnostics; namespace WPFCatalog { public abstract class ViewModelBase : GalaSoft.MvvmLight.ViewModelBase, INotifyPropertyChanged, IDisposable { #region Constructor protected ViewModelBase() { } #endregion // Constructor #region DisplayName /// /// Returns the user-friendly name of this object. /// Child classes can set this property to a new value, /// or override it to determine the value on-demand. /// public virtual string DisplayName { get; protected set; } #endregion // DisplayName #region Debugging Aides ///// ///// 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 virtual void OnPropertyChanged(string propertyName) //{ // this.VerifyPropertyName(propertyName); // PropertyChangedEventHandler handler = this.PropertyChanged; // if (handler != null) // { // var e = new PropertyChangedEventArgs(propertyName); // handler(this, e); // } //} #endregion // INotifyPropertyChanged Members #region IDisposable Members /// /// Invoked when this object is being removed from the application /// and will be subject to garbage collection. /// public void Dispose() { this.OnDispose(); } /// /// Child classes can override this method to perform /// clean-up logic, such as removing event handlers. /// protected virtual void OnDispose() { } #if DEBUG /// /// Useful for ensuring that ViewModel objects are properly garbage collected. /// ~ViewModelBase() { string msg = string.Format("{0} ({1}) ({2}) Finalized", this.GetType().Name, this.DisplayName, this.GetHashCode()); System.Diagnostics.Debug.WriteLine(msg); } #endif #endregion // IDisposable Members } }