В прошлом с формами Windows я использовал части Составной блок прикладного интерфейса пользовательского интерфейса в сочетании с некоторыми централизованными правилами обработки команд и безопасности, чтобы достичь слабосвязанного подхода MVC к интерфейсу для привязки к выполнению команд. Я хотел бы знать, как сделать это в WPF с ICommand
или RoutedCommand
?
Мои предыдущие реализации будут состоять из следующего:
- Свяжите каждую команду со строкой в форме URI на основе REST, например, cmd: // myapp / orders / create
- Напишите пользовательский
ICommand
(не путать с WPF), который будет обрабатывать выполнение команды, у него просто есть метод Execute()
и свойство CanExecute
вместе с Undo()
и `CanUndo, если поддерживается отмена возможности.
- Объекты интерфейса, необходимые для выполнения команды, будут затем свободно связаны
- Обработка события
Click
, которое не будет знать о том, какую команду выполнять, но будет просто передавать централизованное CommandManager
имя команды для выполнения.
- Как только
CommandManager
получит выполнение команды, он просто использует возможности «многие ко многим» в Блок приложения составного пользовательского интерфейса , чтобы вызвать событие команды.
- Перед фактическим выполнением команды диспетчер команд выполняет проверку безопасности, которая в основном задает мой
SecurityManager
, если вошедший в систему пользователь может выполнить командную строку, правила безопасности загружаются через файл XML и состоят из шаблонов, таких как ' CMD: // MyApp / финансы / * '
- Как только событие команды вызывается для команды получения, оно будет отвечать за определение состояния и контекста с помощью зависимостей на основе модели представления.
Мне нравится этот подход, потому что он прост в написании, слабо связан, и командам разрешено получать состояние интерфейса только через модели представления, которые находятся через DI. Блок приложения составного интерфейса пользователя также позволил мне "включить / отключить / недоступно"
Я могу аналогичным образом реплицировать почти все, кроме «строкового» представления команды, это жизненно важно, поскольку написанный нами контекст безопасности может заблокировать целый раздел с помощью шаблонов команд, таких как cmd://myapp/finance/*
, мы также можем затем позволить пользователь решает свои командные комбинации клавиш и т. д.
Ключевые требования для меня:
- Команды должны быть представлены в виде строк, это абсолютное требование.
- Должно быть в состоянии указать, что строка команды "включена", "отключена" и "недоступна" (это означает, что она должна быть скрыта в пользовательском интерфейсе.
- Элементы интерфейса не должны знать, как обрабатывать команду или как предоставлять контекст, это сама ответственность команд через обнаруживаемые им объекты модели представления.
- Выполнение команды должно быть централизованным, т. Е. Мне нужен объект диспетчера команд, который обрабатывает возникновение события для выполнения команды наряду с поддержанием стека отмены.
EDIT : Я только что подумал о том, как обеспечить привязку команды с помощью экспорта MEF для предоставления пользовательских метаданных с указанием имени команды, а затем ImportMany может загрузить их в мой CommandManager
, теперь это просто вопрос
- Сообщая элементам интерфейса a
Command String
, что они вызывают, и;
- Разрешение изменению состояния командных строк (включено / отключено / недоступно).
РЕДАКТИРОВАТЬ 2 : Я подумал о решении, в котором мой CommandManager
принимает ставку Register(Control, String)
, в которой можно зарегистрировать элемент управления с помощью командной строки, тогда менеджер команд может обрабатывать включение / отключение/ скрытие элементов пользовательского интерфейса при изменении их состояния и привязке к ним событий, что обеспечивает гораздо большую гибкость и развязку, а также позволяет настраивать пользователя (перемещение меню, конфигурации кнопок, сочетания клавиш и т. д.).Это вызывает беспокойство, хотя я не использую ни единой точки средства ICommand
, предоставляемого WPF, в конце концов, я не думаю, что это имеет значение, но я хотел бы знать, можно ли использовать средство управления, предоставляемое с WPF.используется так просто, как я определил.Другое преимущество заключается в том, что этот метод не является специфичным для WPF и может использоваться где угодно.