using System; using System.ComponentModel; using Developpez.Dotnet.Windows.Service; namespace Developpez.Dotnet.Windows.ViewModel { /// /// Classe de base pour toutes les classes ViewModel (Vue-Modèle) dans le cadre du pattern MVVM /// Fournit le support pour la notification de changement des propriétés (interface INotifyPropertyChanged) /// et propose une propriété DisplayName. Cette classe est abstraite. /// /// Cette classe est inspirée de celle proposée par Josh Smith dans son article sur le pattern MVVM. public abstract class ViewModelBase : IDisposable, INotifyPropertyChanged { #region Constructeur /// /// Crée une nouvelle instance de ViewModelBase. Ce constructeur est protégé et ne peut /// être appelé que par les classes dérivées. /// protected ViewModelBase() { } #endregion // Constructeur #region Propriétés publiques /// /// Renvoie le nom convivial de cet objet. /// Les classes dérivées peuvent affecter une nouvelle valeur à cette propriété, /// ou modifier son implémentation pour déterminer la valeur à la demande /// public virtual string DisplayName { get; protected set; } #endregion // Propriétés publiques #region Membres de INotifyPropertyChanged /// /// Se produit quand la valeur d'une propriété de cet objet est modifiée /// public event PropertyChangedEventHandler PropertyChanged; /// /// Raccourci pour vérifier si la valeur d'une propriété est modifiée, /// affecter la nouvelle valeur au champ, et déclencher si besoin l'évènement /// PropertyChanged. /// /// Type de la propriété /// Champ qui stocke la valeur de la propriété /// Nouvelle valeur affectée à la propriété /// Nom de la propriété protected void SetProperty(ref T backingField, T newValue, string propertyName) { if (!Equals(backingField, newValue)) { backingField = newValue; OnPropertyChanged(propertyName); } } /// /// Déclenche l'évènement PropertyChanged sur cet objet. /// /// La propriété dont la valeur a changé protected virtual void OnPropertyChanged(string propertyName) { PropertyChangedEventHandler handler = this.PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } #endregion // Membres de INotifyPropertyChanged #region Membres de IDisposable /// /// Libère les ressources liées à cet objet /// public virtual void Dispose() { } #endregion // Membres de IDisposable #region GetService /// /// Renvoie le service du type spécifié avec le nom spécifié /// /// Type du service /// Nom du service /// Le service demandé s'il existe. Sinon, une ServiceNotFoundException est levée. public virtual TService GetService(string name) { return ServiceLocator.Instance.GetService(name); } /// /// Renvoie le service sans nom du type spécifié /// /// Type du service /// Le service demandé s'il existe. Sinon, une ServiceNotFoundException est levée. public TService GetService() { return GetService(null); } #endregion } /// /// Classe de base pour un ViewModel qui expose le modèle via une propriété fortement typée /// /// Type du modèle public abstract class ViewModelBase : ViewModelBase { /// /// Renvoie le modèle lié à ce ViewModel /// public TModel Model { get; protected set; } } }