Я строю приложение на Python с оболочкой Python для WPF и с поддержкой DAG. В настоящее время я нахожусь в точке, где я должен выбрать согласованный способ взаимодействия между данными и представлением.
Насколько я вижу, в настоящее время есть два очевидных решения.
Первый из них похож на структуру приложений Android. У вас есть контроллер, который устанавливает / заполняет представление. Таким образом, контроллер владеет представлением и отправляет только те примитивные данные, которые будут отображаться. Представление - просто тупой слой и не имеет представления о том, что происходит и откуда эти данные. И затем, если пользователь взаимодействует с представлением, он отправит обратные вызовы контроллеру (если он зарегистрирован).
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)
Второй - это передача (ссылка) модели в представление и разрешение представлению извлекать и обновлять данные. Теперь представление содержит модель и, следовательно, может обновлять ее без каких-либо дополнительных обратных вызовов к контроллеру.
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)
Поэтому я думаю, что я спрашиваю, должен ли я передать очень примитивные данные и сохранить представление как можно более общим, затем работать с обратными вызовами и выполнять бизнес-специфику в контроллере.
Или я должен передать всю модель в представление и позволить представлению обновить модель напрямую. Это означает, что будет меньше кода для ввода.
PS. Не судите код - это просто для наглядности.
РЕДАКТИРОВАТЬ:
Кроме того, чтобы добавить - это приложение будет написано на Python, который поддерживает Ducktyping. Это означает, что при втором подходе представление можно использовать повторно, если модель соответствует требуемому интерфейсу.