2012-06-29 18 views
6

Wydaje się, że nie ma wskazówek, że model nie należy wystawiać jej podmioty aby zobaczyć, i że wszystkie wymagane właściwości powinny być powielane w ViewModelMVVM powielenie właściwości modelu w ViewModel

Przykład:

Product 
Id {get; set;} 
Name {get; set;} 
....... 


ProductViewModel : ViewModelBase 
Id {get; set;} 
Name {get; set;} 
....... 

Dlaczego jest to wymagane? Rozumiem to, jeśli Model nie implementuje INPC, ale jeśli tak, to uważam to za zupełnie niepotrzebne.

Odpowiedz

7

gdy widok jest zobowiązany do Modelu:

  • Jeśli View musi zmienić lub masz wiele widoków zmiany do modelu spowoduje zmiany do wszystkich Wyświetleń zmierzały do ​​tego modelu.

  • Z perspektywy widoku obiekt, do którego się przywiązuje, może nie być tak intuicyjny; kiedy musisz dodać właściwości i/lub polecenia do obiektu, dodajesz je do ViewModel i zachowujesz "oryginalne" właściwości w Modelu lub modyfikujesz Model?

Posiadanie ViewModel daje dodatkową abstrakcji między jednym modelu i wielokrotnego (wersje) Widok

W sumie to tylko wytyczne, ale należy pamiętać, że to, co wydaje się OK dzisiaj może być nie tak świetne, gdy trzeba zmodyfikować/zaktualizować aplikację.

+0

Witam, z mojego punktu widzenia, model jest POCO z INPC – Goran

+0

Niestety mam problemy z pisaniem z mojego telefonu, odpowiem, gdy wrócę do domu – Goran

+0

Uważam model za coś, co jest dostarczane przez zewnętrzne źródło (klasy proxy, repozytorium, strumień) INPC jest potrzebny tylko wtedy, gdy chcę, aby Widok był aktualizowany przez zmiany w tym, co jest z nim związane. Nigdy nie wiążę Modelu z Widokem z powodów w mojej odpowiedzi, do czego służy ViewModel. –

3

Przewodnictwo, właśnie to. To zależy od sytuacji. Puryści będą twierdzić, że oddzielenie modelu całkowicie od widoku pozwala na zmianę modelu bez zmiany widoku.

staram się tylko właściwości modelu proxy jeśli muszę (albo INPC lub jakiś widok specyficzna logika jak model ma Imię i Nazwisko ale nie FullName)

przeciwnym wypadku wiążę do modelu (który jest własnością publiczną na ViewModel). Jeśli moja sytuacja ulegnie zmianie i muszę coś zamknąć, to wtedy będę potrzebował.

Zawsze staram się zapewnić, że istnieje ViewModel na miejscu (nawet jeśli tylko eksponuje model), więc refaktoryzacja jest łatwiejsza później.

+0

Cześć Adam, przepraszam za spóźnioną odpowiedź, byłem na wakacjach.W jaki sposób poradzisz sobie z sytuacją, w której musisz wyświetlić kolekcję klientów w widoku faktury, gdzie wymagane są tylko bardzo podstawowe informacje (przykład Kod, nazwa i identyfikator). Czy masz model CustomerBasicInfo w swoim modelu, czy ...? – Goran

+0

Zwykle model jest podyktowany użytkownikowi, przez domenę, przez usługę sieciową itp. Dlatego tworzy się model przeglądania w celu owinięcia modelu i ułatwienia prezentowania danych (np. Dodawania właściwości, takich jak wybrane, widoczne itp.). Jeśli masz widok tylko do odczytu, a model jest dostatecznie podobny do struktury widoków, możesz zawsze użyć go teraz i zastąpić go później modelem podglądu w miarę zmiany specyfikacji. Uważaj, aby pozwolić UI na wkradnięcie się do twojego modelu –

1

Moje pytanie brzmi: dlaczego wasze modelki wdrażają INPC? Czy oni muszą?

Zwykle modele są po prostu DTO i nie wymagają żadnej logiki zmian.

Również jeśli twoja podstawowa implementacja INPC pochodzi ze struktury MVVM, ale twoje modele istnieją w zespole wspólnym, czy ten zestaw wymaga odniesienia do twojej struktury MVVM i potencjalnie innych zestawów WPF?

Nasz scenariusz był zbiorem wspólnych obiektów reprezentujących nasze dane zarówno po stronie serwera, jak i klienta. Strona klienta była aplikacją WPF, więc było dobrze, ale dla strony serwera była usługa, więc nie potrzebowaliśmy INPC.

+0

Witam Cameron, przepraszam za spóźnioną odpowiedź, byłem na wakacjach. Cóż, ktoś musi wdrożyć INPC, eithee Customer (Model) lub CustomerViewModel. Czy w każdym scenariuszu potrzebujemy DTO? Jeśli chcesz wprowadzić odniesienie do struktury MVVM z Modelu, możesz, ale nie jest to wymagane. Implementacja INPC jest bardzo prosta. ViewModelBase ze środowiska MVVM będzie nadal używany jako baza dla VIewModels. Mój problem jest następujący: jeśli zadaję pytanie "czy powinienem powielić wszystkie właściwości modelu w VM", a odpowiedź brzmi "tak", niezależnie od typu aplikacji, zastanawiam się - dlaczego? – Goran

0

Twój ViewModel jest niepoprawny. Jeśli masz już model typu produktu, możesz po prostu zdefiniować coś takiego w swoim produkcie ViewModel: produkt produktu publicznego {...}

+2

To jest rdzeń jego pytania! Narażenie Modelu na Widok omija odpowiedzialność ViewModel. –

Powiązane problemy