Я заново работаю с приложением Winforms и хотел бы использовать вариант шаблона Presentation Model для пользовательского интерфейса.Может ли кто-нибудь сказать мне из следующих объяснений, если я делаю это правильно?
Я решил настроить зависимости следующим образом:
Model <---- Presentation Model <---- View
То есть:
Модель не знает ничего, кроме себя.
Модель представления имеет ссылку на модель (но не наоборот).
Представление имеет ссылку на модель презентации (но не наоборот).
Я использую привязку данных Winforms, чтобы сохранить представление и представлениемодель синхронизирована.
Теперь все это работает как брелок, за исключением случаев, когда мне нужно иметь дело, например, с нажатием на кнопку «Закрыть» формы.Поскольку модель представления не имеет ссылки на представление, она не может подписаться на любые события, опубликованные представлением.Таким образом, я придумал следующий костыль:
Presentation Model View
+--+ +--+
| | | |
| | | <--------X closeButton.Click event fires
| | | |
| | +--------X |
| | CloseRequested = true | | |
| | +--------> |
| | | |
| | CloseRequested CloseRequested | |
| <-----------------------------------< |
| | | |
| X--------+ | |
| | | IsClosed = true | |
| <--------+ | |
| | | |
| | IsClosed MustClose | |
| >-----------------------------------> |
| | | |
| | | X--------> view.Close()
| | | |
+--+ +--+
То есть:
Пользователь нажимает кнопку «Закрыть».
Событие Click
кнопки фиксируется в представлении, которое реагирует, устанавливая свойство CloseRequested
.
Привязка данных переносит это значение в соответствующее свойство вмодель презентации.
Модель презентации реагирует на это изменение, устанавливая ее свойство IsClosed
.
Привязка данных переносит это значение вMustClose
.
Представление реагирует на это изменение, закрывая себя.
Модель представления довольно хорошо отделена от представления,и наоборот это большая работа только для обработки одной кнопки .Есть ли более простой способ, учитывая график зависимости, который я выбрал?