Какой шаблон проектирования я использую для синхронизации изменений в состоянии объектной модели с состоянием графического интерфейса? - PullRequest
4 голосов
/ 12 февраля 2010

Я обычно работаю над графическим интерфейсом, где я хочу напрямую запретить пользователю делать то, что он не должен делать, отключив элементы управления в форме. Например, может быть, я не хочу, чтобы кнопка «Виджеты процессов» была включена, если у пользователя в данный момент не открыто «Проект виджетов» в приложении? Или кнопка «Отменить обработку» становится активной только тогда, когда выполняется обработка виджета.

Существует ли обычно используемый шаблон проектирования для синхронизации изменений состояния в объектной модели с состоянием графического интерфейса пользователя?

Ответы [ 4 ]

1 голос
/ 19 февраля 2010

Шаблоны MVC и Command должны работать здесь. Основная идея заключается в том, что вам нужно отправить «сообщение» (которое может быть объектом, строкой или чем-то еще) в GUI, чтобы уведомить его об изменении его состояния и как. Вам просто нужно быть осторожным, чтобы принять во внимание любые задержки, которые могут возникнуть из-за получения и обработки сообщения с помощью графического интерфейса.

Вы можете создать очередь событий (связанных с командами) и убедиться, что первая входящая - первая выходная (следовательно, очередь). Затем обработайте GUI следующее событие в очереди, это обеспечит обновление GUI перед тем, как вы запустите другое событие, чтобы выполнить то, что вы только что попытались отключить. Затем вы можете сообщить об ошибке или игнорировать ее или что-то еще. В любом случае, пользователь не сможет что-то сделать после получения команды на отключение этой функции. Отключение кнопки GUI - это просто визуальный эффект, и должен быть код предупреждения для команд в фоновом режиме, которые действительно выполняют эту работу за вас.

1 голос
/ 12 февраля 2010

Похоже, вы ищете возможность подписаться на определенные события. Я бы сказал, используйте шаблон наблюдателя. Шаблон состояний для этой ситуации немного перегружен [если он был больше двоичного условия, вы могли бы приспособить шаблон состояний к работе для него]

0 голосов
/ 24 февраля 2010

Это не относится к winforms, но Qt недавно представил платформу конечных автоматов, чтобы упростить изменение состояния элементов пользовательского интерфейса на основе внутреннего состояния приложения. Для получения дополнительной информации смотрите документацию Qt .

Эта идея, вероятно, может быть применена и к приложению на основе winforms. Хотя это может стоить значительных начальных усилий. Я не знаю ни о каких существующих реализациях.

0 голосов
/ 13 февраля 2010

Я не эксперт, но в последнее время я читал о шаблоне Model-View-ViewModel для WPF, который в основном является шаблоном MVC, использующим преимущества функций WPF. Поскольку вы используете winforms, вы можете попробовать шаблон Model-View-Presenter. Здесь есть статья об этом .

Если вы можете переключиться на WPF (хотя у меня есть ощущение, что в winforms есть что-то похожее), похоже, вы определенно хотите использовать функцию «Команды». Он имеет некоторые функции, которые вы хотите встроить. В основном, любая кнопка или любая другая подписывается на команду, и есть одна логическая часть, которая определяет, включена ли команда или отключена. Вам просто нужно проверить это состояние вашей модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...