Buduję aplikację w Pythonie z otoki Pythona dla WPF i ze wsparciem DAG. Obecnie jestem w punkcie, w którym muszę zdecydować o spójnym sposobie interakcji między danymi a widokiem.
O ile wiem, istnieją obecnie dwa oczywiste rozwiązania.
Pierwszy jest podobny do struktury aplikacji Android. Masz kontroler, który ustawia / wypełnia widok. Tak więc kontroler jest właścicielem widoku i przekazuje tylko pierwotne dane, które zostaną wyświetlone. Widok jest tylko głupią warstwą i nie ma pojęcia, co się dzieje i skąd pochodzą te dane. A jeśli użytkownik wejdzie w interakcję z widokiem, wyśle wywołania zwrotne do kontrolera (jeśli został zarejestrowany).
UserInfoController.py
userInfoView = UserInfoView()
userInfoView.onGenderChangedCallback = self.onGenderChangedCallback
userInfoView.setUserGenderValue(user.getGender())
UserInfoView.py
def setUserGenderValue(self, gender):
self.userGender = gender
def getView(self):
return ui.Label(self.userGender, onEditCallback=self.onGenderChangedCallback)
Drugi polega na przekazaniu do modelu (referencji) modelu i umożliwieniu mu pobrania i aktualizacji danych. Widok zawiera teraz model i dlatego może go aktualizować bez żadnych dodatkowych wywołań zwrotnych do kontrolera.
UserInfoViewModel.py
self.gender = 'Male'
UserInfoView.py
def getView(self):
return ui.Label(self.ViewModel().getGender(), onEdited=self.genderEdited)
def genderEdited(self, newValue):
self.ViewModel().setGender(newValue)
Myślę, że pytam o to, czy powinienem przekazać bardzo prymitywne dane i zachować widok tak ogólny, jak to możliwe, a następnie pracować z wywołaniami zwrotnymi i wykonywać specyfikacje biznesowe w kontrolerze.
A może powinienem przekazać cały model do widoku i pozwolić widokowi na bezpośrednią aktualizację modelu. Oznacza to, że będzie mniej kodu do wpisania.
PS. Nie oceniaj kodu - to tylko wizualizacja.
EDYTOWAĆ:
Również dodać - ta aplikacja zostanie napisana w języku python, który obsługuje przechwytywanie. Oznacza to, że przy drugim podejściu widok jest nadal wielokrotnego użytku, o ile model spełnia wymagany interfejs.