using System; using System.Collections.Generic; using System.Diagnostics; using System.ComponentModel; using System.Text; using System.Windows; using System.Windows.Controls; namespace TradeBlotter.ViewModels { public interface IPersistentViewModel { SaveParameters GetSaveParameters(); void SetSaveParameters(SaveParameters saveParameters); bool CanPersist(); } public abstract class ModelBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual bool ThrowOnInvalidPropertyName { get; private set; } protected virtual void OnPropertyChanged(string propertyName) { this.VerifyPropertyName(propertyName); PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { var e = new PropertyChangedEventArgs(propertyName); handler(this, e); } } public void VerifyPropertyName(string propertyName) { if (TypeDescriptor.GetProperties(this)[propertyName] == null) { string message = "Invalid property name: " + propertyName; if (this.ThrowOnInvalidPropertyName) throw new Exception(message); else Debug.Fail(message); } } } public abstract class ViewModelBase : ModelBase, IDisposable, IPersistentViewModel { protected ViewModelBase() { } public abstract SaveParameters GetSaveParameters(); public abstract void SetSaveParameters(SaveParameters saveParameters); public abstract bool CanPersist(); public virtual void Dispose() { this.OnDispose(); } public virtual String DisplayName { get; protected set; } protected virtual void OnDispose() { } #if DEBUG ~ViewModelBase() { } #endif } }