/ / Potrzebujesz porady dotyczącej implementacji interfejsu użytkownika w WPF - wpf, wzorce projektowe, mvvm, interfejs użytkownika, mvp

Potrzebujesz porady na temat implementacji interfejsu użytkownika w WPF - wpf, wzorce projektowe, mvvm, interfejs użytkownika, mvp

Potrzebuję porady dotyczącej implementacji interfejsów użytkownika w WPF.

Do tej pory używałem Code-Behinds, który jest niezwykle łatwy do uruchomienia, ale piekło podczas utrzymywania / zmieniania / testowania.

Przyjrzałem się MVP (i jego wariancie WPF - MVVM), ale miałem problemy z uruchomieniem.

Zakładając, że mam interfejs do zbudowania, oto co ja myśleć Powinienem zrobić:

1. Utwórz klasę Mediator "Main UI", która określa WSZYSTKIE operacje na wysokim poziomie (LoadSettings (), SetVisibility ()) i zdarzenia (niewyzwolone przez użytkownika, np. Zmienione dane modelu) obsługiwane przez mój interfejs użytkownika.

2. Utwórz klasy "Model", aby reprezentować dane

3. Utwórz klasy "ViewModel" dla moich klas modeli.

4. W przypadku złożonych zachowań (np.g, należy wykonać sekwencję operacji, zanim UI może / powinien zostać zaktualizowany, np. modyfikując elementy w kolekcji), nie należy polegać na ViewModels w celu aktualizacji interfejsu użytkownika. Zamiast tego rób to ręcznie przez klasę Mediator głównego interfejsu użytkownika.

5. Aby uzyskać proste zachowania (np. Przełączanie stanów widoczności / włączonych / etc), użyj wiązania WPF, aby powiązać właściwości ViewModels "bezpośrednio z interfejsem użytkownika.

W tym przypadku będzie to klasa Mediator głównego interfejsu użytkownikautrzymywać zarówno obiekty ViewModel i Model, jak i odpowiednio delegować interakcje użytkownika (do Modelu) i żądania aktualizacji interfejsu użytkownika (do ViewModel / View). Klasa Mediator zapewnia również scentralizowany interfejs, który określa funkcjonalności interfejsu użytkownika, jednocześnie działając jako menedżer zmiany (opisany w wzorcu Obserwatora GOF), aby obsłużyć złożone zachowanie interfejsu użytkownika / ograniczyć zbędne aktualizacje interfejsu użytkownika.

Czy jestem na dobrej drodze? Czy powinienem poprawić moje podejście? Zmień to całkowicie? W tej chwili brakuje mi doświadczenia / wiedzy do wdrożenia ogromnych / złożonych interfejsów, więc nie wiem, czy jestem na dobrej drodze.

Dzięki

Odpowiedzi:

4 dla odpowiedzi № 1

To trochę za długie, przepraszam!

Do tej pory używałem Code-Behinds, który jest niezwykle łatwy do uruchomienia, ale piekło podczas utrzymywania / zmieniania / testowania.

Tak :) Za każdym razem, gdy musisz podać nazwę kontrolki i napisać "someControl dot blah" w swoim kodzie, to jest to zapach kodu. Czasami jest to nieuniknione, ale spróbuj ograniczyć to maksymalnie. Twój interfejs użytkownika to występ z Model - ViewModels i ValueConverters są sposobem radzenia sobie z niedopasowaniem impedancji między dwiema domenami.

Kilka problemów z twoim podejściem:

Utwórz klasę Mediator "Główny interfejs", która określa WSZYSTKIE operacje na wysokim poziomie

Zamiast tego, twoja klasa okna działa jak "kontroler"; ważne jest, użyj Imponujący aby zdefiniować swoje działania na najwyższym poziomie. W ten sposób można oddzielić klasy UserControl od klasy Window, ponieważ UserControl po prostu wywoła polecenie Commands.Open.Execute (null, this), a Window może obsłużyć to, a UserControl nigdy nie będzie wyraźnie zależny od Window.

Utwórz klasy "ViewModel" dla moich klas modeli.

W MVVM, część VM ma pomóc ty out - jeśli możesz odejść z wiązaniem bezpośredniodo modelu (tzn. dane się nie zmieniają lub nie masz nic przeciwko implementacji INotifyPropertyChanged w swoich modelach), a następnie robi to (nawet jeśli musisz użyć kilku klas IValueConverter) jest ok. ViewModels są najczęściej używane, gdy widok jest więc różni się od reprezentacji modelu, że bycie złym byłoby zhackować swój model lub "przyczepić się" do dodatkowych właściwości, które mają sens tylko w tym konkretnym widoku.

działając jako menedżer zmian ...

Pamiętaj, że WPF robi to za Ciebie, przezWłaściwości zależności i INotifyPropertyChanged; nie odkrywaj ponownie koła, jeśli napiszesz funkcję OnDataUpdate (), jest to znak, że nie używasz poprawnie powiązania danych.

np. sekwencja operacji musi zostać wykonana przed aktualizacją / zaktualizowaniem interfejsu użytkownika, na przykład poprzez modyfikację elementów w kolekcji

To jest gdzie Imponujący jest świetny - twój CanExecute funkcja może zastosować dowolnie złożoną logikęZdecyduj, czy dana czynność może zostać wykonana, a jeśli zwiążesz ją z elementami interfejsu użytkownika, takimi jak Menu lub Przyciski, automatycznie będą one wyłączać / włączać w razie potrzeby.


1 dla odpowiedzi nr 2

Nie wspomniano o tym, ale wykonuję cały projekt interfejsu użytkownika w XAML.

Nie ma nic gorszego niż zobaczenie interfejsu użytkownika WPF za pośrednictwem kodu źródłowego.