2013-03-14 2 views
6

Więc jeśli przechowuję nadrzędny wzorzec ViewModel w potomku ViewModel będzie to przestępstwo? Czy złamie zasady MVVM? Widok Moje dziecko jest oknem z menu kontekstowym. Po wybraniu odpowiedniego elementu menu należy utworzyć nowy widok podrzędny. Tylko rodzic jest odpowiedzialny za stworzenie widoku podrzędnego. Utrzymanie odniesienia do modelu widoku rodzica przyniesie mi wiele dobrego. W tym samym czasie nie chcę łamać reguł wzorca.Czy powinienem zapisać referencję do nadrzędnego modelu widoku w podglądzie podrzędnym?

class MainViewModel 
{ 
    List<ChildViewModel> _childrenViewModels = new List<ChildViewModel>(); 

    public AddChild(ChildViewModel childViewModel) 
    { 
     _childrenViewModels.Add(childViewModel); 
     childViewModel.Owner = this; 
    } 
} 

class ChildViewModel 
{ 
    private Child _child; 
    public MainViewModel Owner { get; set; } 

    public ChildViewModel(Child child) 
    { 
     _child = child; 
    } 
} 
+1

Wzorce są tylko wskazówką, aby zacząć; już nie. Tylko jeśli odejdziesz od wzorca, powinieneś rozejrzeć się i zobaczyć, czy wybrałeś niewłaściwy wzór. –

+0

Wzory nie są przeznaczone do tworzenia architektury, mają na celu rozwiązywanie problemów, które mogą pojawić się w architekturze. Najprostszym sposobem na zapewnienie celu biznesowego i uczciwości jest właściwa droga. – Greg

+2

'Więc jeśli przechowuję nadrzędny wzorzec ViewModel w potomku ViewModel będzie to przestępstwo' - Absolutnie NIE. Kto Ci to powiedział? Jest całkowicie OK, że KAŻDY ViewModel ma odniesienie do KAŻDEGO innego ViewModel (o ile nie zawiera odwołań do Elementów UI). Ideą MVVM jest oddzielenie prezentacji od zachowania, a nie tworzenie wielu ograniczeń, które uniemożliwiają pisanie czystego kodu. –

Odpowiedz

2

Odpowiedź brzmi: nie, ale dla twojego celu, dlaczego potrzebujesz tego odniesienia, jeśli cały rodzic robi to tworzenie potomka viewmodel. Jaki jest cel posiadania tego powiązania?

+0

Potrzebuję odniesienia, ponieważ gdy użytkownik wybierze określony element menu z menu kontekstowego widoku podrzędnego, powinien utworzyć nowe okno. Teraz chcę pozostawić go do widoku nadrzędnego (głównego) do tworzenia widoków podrzędnych i okien. Ale wydarzenie dzieje się w widoku podrzędnym. Może moglibyśmy także przeprowadzić routing wydarzeń? Nie wiem, WPF jest tak duża, bez względu na to, ile książek czytam, nie pamiętam wszystkiego. Dlatego pracuję nad tym projektem, aby naprawdę go zrozumieć. – armanali

3

NIE. Generalnie, jeśli użyjesz tej techniki wiele razy, staraj się ukryć ją za abstrakcją, w rzeczywistości jest to tym, co słynny projekt Caliburn.Micro [I love it] robi ze swoim IChild interface.

0

Chociaż ten wzorzec nie jest w ogóle zbrodnią ani "zapachem kodu", w wielu sytuacjach lepiej jest przekazać odniesienie do rodzica w postaci implementatora interfejsu, a nie jako własnej klasy. Tak więc, tylko właściwości lub metody, do których dziecko musi uzyskać dostęp w macierzystym są zdefiniowane w interfejsie, ale dziecko nie ma dostępu do innych publicznych metod lub właściwości klasy nadrzędnej, co może powodować błędy, jeśli są używane przez pomyłkę. Może to wymagać nieco więcej kodu, ale luźniejsze połączenie między klasami może przynieść korzyści. Jeśli nic więcej, pomaga to uczynić połączenie między dzieckiem i rodzicem bardziej samokonujące i łatwiejsze dla osób czytających kod do zrozumienia.

Powiązane problemy