Ich erstelle eine Anwendung in Python mit einem Python-Wrapper für WPF und mit DAG-Unterstützung. Ich bin derzeit an einem Punkt angelangt, an dem ich mich für eine konsistente Art der Interaktion zwischen den Daten und der Ansicht entscheiden muss.
Soweit ich sehe, gibt es derzeit zwei offensichtliche Lösungen.
Die erste ähnelt der Struktur von Android-Anwendungen. Sie haben einen Controller, der die Ansicht festlegt / auffüllt. Der Controller besitzt also die Ansicht und überträgt nur die primitiven Daten, die angezeigt werden. Die Ansicht ist nur eine blöde Ebene und hat keine Ahnung, was passiert und woher diese Daten stammen. Wenn der Benutzer dann mit der Ansicht interagiert, sendet er Rückrufe an den Controller (sofern dieser registriert ist).
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)
Zweitens übergibt ein (Referenz-) Modell an die Ansicht und lässt die Ansicht die Daten abrufen und aktualisieren. Die Ansicht enthält jetzt das Modell und kann daher ohne zusätzliche Rückrufe an die Steuerung aktualisiert werden.
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)
Ich frage mich also, ob ich die sehr primitiven Daten übergeben und die Ansicht so allgemein wie möglich halten soll, dann mit Rückrufen arbeiten und die geschäftlichen Besonderheiten im Controller ausführen soll.
Oder sollte ich das gesamte Modell an die Ansicht übergeben und die Ansicht das Modell direkt aktualisieren lassen. Dies bedeutet, dass weniger Code eingegeben werden muss.
PS. Beurteilen Sie den Code nicht - er dient nur zur Visualisierung.
BEARBEITEN:
Auch hinzuzufügen - diese Anwendung wird in Python geschrieben, das ducktyping unterstützt. Dies bedeutet, dass beim zweiten Ansatz die Ansicht weiterhin wiederverwendbar ist, solange das Modell die erforderliche Schnittstelle erfüllt.