Я перерабатываю приложение Winforms и хотел бы использовать вариант шаблона Модель представления для пользовательского интерфейса. Может ли кто-нибудь сказать мне из следующих объяснений, правильно ли я это делаю?
Я решил настроить зависимости следующим образом:
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
.Представление реагирует на это изменение, закрываясь.
Модель представления достаточно хорошо отделена от представления и наоборот, однако это требует много работы только для обработки одной команды кнопки. Есть ли более простой способ, учитывая график зависимостей, который я выбрал?