Le contrôleur et le ViewModel diffèrent de différentes manières.
Dans MVC, le contrôleur connaît la vue, il peut changer la vue. Il connaît également le modèle et peut l'appeler. Dans MVVM, un ViewModel est une représentation abstraite de la vue et ne connaît pas l'interface utilisateur concrète, il enveloppe le modèle de manière à ce qu'il puisse être affiché comme vous le souhaitez.
Dans le MVC classique, un contrôleur n'est qu'une stratégie de la vue pour interagir avec le modèle. En fait, parfois, un contrôleur n'est même pas nécessaire. Dans MVVM, vous n'en avez pas besoin, car vous pouvez avoir différents ViewModels pour la même vue si vous avez besoin de comportements différents. Dans MVC, vous pouvez avoir par exemple un ReadOnlyController ou un AdminController pour communiquer avec le modèle. Dans MVVM, vous pouvez simplement avoir deux ViewModels et vous choisissez celui dont vous avez besoin pour la vue.
Mais ils ont quelques similitudes. Dans les deux modèles, la vue est un observateur . Dans MVC classique, la vue est un observateur du modèle, dans MVVM c'est un observateur du ViewModel.
Les deux modèles visent à séparer les préoccupations. MVVM vise principalement à fournir une abstraction de la vue, complètement indépendante de la technologie d'interface utilisateur utilisée. MVC ne va pas aussi loin. Son objectif principal est la séparation des préoccupations, afin de ne pas mettre la logique métier (le modèle) dans la vue.
Vous pourriez également trouver utile ma réponse à une question similaire.
Enfin, je dois dire que les deux modèles appartiennent à la même famille. MVP, dont MVVM est un descendant, est un frère de MVC. Si vous voulez en savoir plus suivez ce lien vers le site de Martin Fowler , il explique tout en détail.