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