Tous les ViewModels ont des caractéristiques et des fonctionnalités communes. Dans le but de nous faire gagner du temps et de nous simplifier la vie, une hiérarchie de base est nécessaire. La structure présentée est tirée d'un article de Josh Smith. Dans les fonctionnalités communes, on trouve la notification des propriétés qui peuvent être bindées. Mais aussi la gestion de commandes, de workspaces... 

Les ViewModels sont le coeur de l'architecture. C'est par ces classes que transite toutes les données et toute la logique métier. En effet, les Views ne prennent en charge seulement l'aspect graphique, avec des déclenchements d'animations, des rendus ou encore l'intégration du multimédia. La couche Model quant à elle expose des classes sans logique fonctionnelle. On retrouve cependant dans cette couche, de la logique concernant des conversions de valeurs, ainsi que des validations. Les validations peuvent être soit bindées directement sur les Views via leur ViewModel, soit être utilisées dans une logique fonctionnelle du ViewModel. Un autre point non négligeable dans MVVM est la libération de la mémoire en prenant compte du couplage entre la View et son ViewModel. Dans certaines Views, on pourra laisser la possibilié à l'utilisateur de fermer chacune d'entre elles. Dans ce cas le ViewModel associé devra prendre en charge la libération de la mémoire, ainsi qu'une commande de fermeture. Par rapport à l'architecture de base de Josh Smith, dans son article, j'ai placé une classe dans la hiérarchie qui gère un espace de travail pouvant contenir d'autres espaces de travail. Le conteneur gère les controles de type ItemsControl.

Voici le diagramme de classe qui illustre cette architecture : ViewModelBaseDiagram.png

Il faut savoir que les architectures MVVM peuvent différées selon nos besoins de développement. Lorsque l'on désire poser une telle architecture il est indispensable d'avoir à l'esprit l'ampleur du projet. Pour des petits projets, cette architecture est adéquat, par contre pour des projets plus importants, il existe des frameworks qui exploitent des fonctionnalités très intéressantes comme par exemple le framework Prism, mais l'utilisation d'une telle librairie peut devenir très vite une usine à gaz si l'organisation du projet n'est pas assez verrouillée.