Sto creando un'applicazione in Python con un wrapper Python per WPF e con supporto DAG. Attualmente sono a un punto in cui devo decidere un modo coerente di interagire tra i dati e la vista.
Per quanto vedo ci sono attualmente due soluzioni ovvie.
Il primo è simile a come sono strutturate le applicazioni Android. Hai un controller che imposta / popola la vista. Quindi il controller possiede la vista e invia solo i dati primitivi che verranno visualizzati. La vista è solo un livello stupido e non ha idea di cosa sta succedendo e da dove provengano quei dati. Quindi, se l'utente interagisce con la vista, invierà richiamate al controller (se registrato).
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)
Il secondo è passare un modello (di riferimento) alla vista e consentire alla vista di recuperare e aggiornare i dati. La vista ora contiene il modello e quindi può aggiornarlo senza ulteriori callback al controller.
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)
Quindi suppongo che sia quello che sto chiedendo, dovrei passare i dati molto primitivi e mantenere la vista il più generica possibile, quindi lavorare con i callback e fare le specifiche aziendali nel controller.
O dovrei passare l'intero modello alla vista e consentire alla vista di aggiornare direttamente il modello. Ciò significa che ci sarà meno codice da digitare.
PS. Non giudicare il codice: è solo per la visualizzazione.
MODIFICARE:
Inoltre , questa applicazione verrà scritta in Python che supporta il ducktyping. Ciò significa che con il secondo approccio, la vista è ancora riutilizzabile purché il modello soddisfi l'interfaccia richiesta.