Przykład # 1: Mam widok wyświetlany w mojej aplikacji MVVM (użyjmy Silverlight do celów dyskusji) i klikam przycisk, który powinien zabrać mnie na nową stronę.
Przykład # 2: Ten sam widok ma inny przycisk, który po kliknięciu powinien otworzyć widok szczegółów w oknie potomnym (oknie dialogowym).
Wiemy, że obiekty Command będą widoczne przez nasz ViewModel powiązany z przyciskami metodami reagującymi na kliknięcie użytkownika. Ale co wtedy? Jak ukończyć akcję? Nawet jeśli korzystamy z tak zwanej usługi nawigacji, to co mówimy?
Mówiąc ściślej, w tradycyjnym modelu Najpierw przeglądaj (takim jak schematy nawigacyjne oparte na adresach URL, takie jak w Internecie lub we wbudowanej ramie nawigacyjnej SL), obiekty Command musiałyby wiedzieć, który Widok będzie wyświetlany następnie. To wydaje się przekraczać granicę, jeśli chodzi o rozdzielenie obaw promowanych przez ten wzorzec.
Z drugiej strony, jeśli przycisk nie był podłączony do obiektu Command i zachowywał się jak hiperłącze, reguły nawigacji można zdefiniować w znacznikach. Ale czy chcemy, aby Widoki kontrolowały przepływ aplikacji i czy nawigacja nie jest tylko innym rodzajem logiki biznesowej? (W niektórych przypadkach mogę powiedzieć „tak”, a w innych „nie”).
Dla mnie utopijną implementacją wzorca MVVM (i słyszałem, jak inni to twierdzą) byłoby połączenie ViewModel w taki sposób, aby aplikacja mogła działać bez głowy (tj. Bez widoków). Zapewnia to największą powierzchnię do testowania opartego na kodzie i sprawia, że widoki są prawdziwą skórką w aplikacji. A mój ViewModel nie powinien dbać o to, czy wyświetla się w oknie głównym, panelu pływającym czy oknie potomnym, prawda?
Zgodnie z tym podejściem do innego mechanizmu w środowisku wykonawczym należy „powiązanie” tego, co Widok powinien być wyświetlany dla każdego modelu ViewModel. Ale co, jeśli chcemy udostępnić widok wielu modelom ViewModels lub odwrotnie?
Więc biorąc pod uwagę potrzebę zarządzania relacją View-ViewModel, abyśmy wiedzieli, co wyświetlać, wraz z potrzebą nawigowania między widokami, w tym wyświetlania okien / dialogów potomnych, jak naprawdę możemy to osiągnąć we wzorcu MVVM?