Eksperymentowałem z często wspomnianym wzorcem MVVM i w niektórych przypadkach miałem trudności z określeniem wyraźnych granic. W mojej aplikacji mam okno dialogowe, które pozwala mi utworzyć połączenie z kontrolerem. Istnieje klasa ViewModel dla okna dialogowego, która jest dość prosta. Jednak okno dialogowe zawiera również dodatkową kontrolę (wybraną przez ContentTemplateSelector
), która zmienia się w zależności od konkretnego typu kontrolera, który jest podłączony. Ta kontrola ma swój własny ViewModel.MVVM: Jak radzić sobie z interakcją między zagnieżdżonymi ViewModels?
Problem, który napotykam, polega na tym, że po zamknięciu okna dialogowego przez naciśnięcie przycisku OK, muszę utworzyć żądane połączenie, które wymaga przechwycenia informacji w wewnętrznej klasie ViewModel specyficznej dla kontrolera. Kuszące jest po prostu, aby wszystkie klasy ViewModel specyficzne dla kontrolera implementowały wspólny interfejs, który tworzy połączenie, ale czy wewnętrzny ViewModel naprawdę powinien być odpowiedzialny za tę konstrukcję?
Moje ogólne pytanie brzmi: czy istnieją ogólnie przyjęte wzorce projektowe dotyczące interakcji ViewModels ze sobą nawzajem, szczególnie gdy "rodzicielska" maszyna wirtualna potrzebuje pomocy z maszyny wirtualnej "dziecko", aby wiedzieć, co robić?
EDIT:
zrobiłem pochodzić z projektu, który jest trochę czystsze niż początkowo myślał, ale ja nadal nie jestem pewien, czy jest to „prawo” sposób to zrobić. Mam niektóre usługi zaplecza, które umożliwiają ContentTemplateSelector, aby spojrzeć na instancji kontrolera i pseudo-magicznie znaleźć kontrolkę do wyświetlania dla konstruktora połączenia. To, co mnie w tym wszystkim dręczyło, to że mój ViewModel na najwyższym poziomie musiałby przyjrzeć się DataContext
wygenerowanemu sterowaniu i przesłać go do odpowiedniego interfejsu, co wydaje się złym pomysłem (dlaczego Widok DataContext
ma cokolwiek wspólnego z tworzeniem ? połączenie)
i skończyłem z czymś takim (upraszczając):
public interface IController
{
IControllerConnectionBuilder CreateConnectionBuilder();
}
public interface IControllerConnectionBuilder
{
ControllerConnection BuildConnection();
}
mam mój wewnętrzny klasy ViewModel wdrożyć IControllerConnectionBuilder
i kontroler zwraca wewnętrzną ViewModel. ViewModel najwyższego poziomu wizualizuje ten IControllerConnectionBuilder
(poprzez mechanizm pseudo-magiczny). Trochę mi to przeszkadza, że to mój wewnętrzny ViewModel wykonujący budynek, ale przynajmniej mój najlepszy ViewModel na najwyższym poziomie nie musi wiedzieć o brudnych detalach (nie ma nawet pojęcia, że wizualizowane sterowanie używa ViewModel).
Z zadowoleniem przyjmuję dodatkowe przemyślenia, jeśli istnieją sposoby, aby to jeszcze bardziej oczyścić. Wciąż nie jest dla mnie jasne, na ile odpowiedzialność jest "w porządku" dla ViewModel.
Zadajemy sobie takie pytanie ciągle w mojej pracy. Bardzo dobrze sformułowałeś to pytanie, więc mam nadzieję, że otrzymasz tutaj dobre opinie. –
Na szczęście jest to projekt dla zwierząt domowych, więc mam luksus eksplorowania różnych projektów. Mój sklep nie zastosował WPF lub MVVM, ponieważ na początku tego okresu obciążenie i nieporęczność nie są akceptowane w naszych obecnych harmonogramach. Mocno wierzę, że jest to technologia, która będzie wypłacać duże dywidendy w wydajności, gdy zrozumiemy, jak z niego korzystać, ale jest to taka zmiana perspektywy, że trudno jest wiedzieć, gdzie narysować linie w projekcie. –