Il controller e il ViewModel si differenziano in vari modi.
In MVC il controller conosce la vista, può cambiare la vista. Conosce anche il modello e può chiamarlo. In MVVM, ViewModel è una rappresentazione astratta della vista e non conosce l'interfaccia utente concreta, ma avvolge il modello in modo che possa essere visualizzato come desiderato.
Nel classico MVC, un controller è solo una strategia della Vista per interagire con il Modello. In effetti, a volte un controller non è nemmeno necessario. In MVVM non ne hai bisogno, poiché puoi avere diversi ViewModel per la stessa vista se hai bisogno di comportamenti diversi. In MVC potresti avere ad esempio un ReadOnlyController o un AdminController per comunicare con il Modello. In MVVM potresti avere solo due ViewModels e scegli quello che ti serve per la Vista.
Ma hanno alcune somiglianze. In entrambi i modelli, la vista è un osservatore . Nel classico MVC, la vista è un osservatore del modello, in MVVM è un osservatore del ViewModel.
Entrambi i modelli hanno lo scopo di fornire una separazione delle preoccupazioni. MVVM mira principalmente a fornire un'astrazione del View, completamente indipendente dalla tecnologia UI in uso. MVC non arriva così lontano. L'obiettivo principale è la separazione delle preoccupazioni, in modo da non mettere la logica aziendale (il modello) nella vista.
Potresti trovare questo rispondi alla mia a una domanda simile utile.
Infine, dovrei dire che entrambi i modelli appartengono alla stessa famiglia. MVP, di cui MVVM è un discendente è un fratello di MVC. Se vuoi saperne di più, segui questo link al sito web di Martin Fowler , che spiega dettagliatamente.