Что ж, я не знаю ни одного готового решения, но создать такую реализацию многоразового диалогового окна не так уж и сложно. Собственно, что-то подобное я реализовал несколько лет назад. Ну, это было на другой работе, поэтому у меня больше нет доступа к коду. Кроме того, я не могу вспомнить все детали, но я могу попытаться дать вам основное представление о такой реализации.
Вы можете создать DialogVm
, который предоставляет общие функциональные возможности диалога.
Прежде всего, что нужно для диалога на уровне презентации? Обычно три кнопки, вроде ...
- Применить, Отмена и Закрыть (диалоговое окно "Изменение")
- ОК и Отмена или Да и Нет (диалоговое окно с вопросом)
- Хорошо (в случае окна сообщения)
Как видите, вам нужны три команды (ICommand
документ). Фактически, я создал DelegateCommand
реализацию (на основе this). ICommand.CanExecute
определяет, активирована или отключена привязанная кнопка. Если команда пуста, кнопка должна быть скрыта.
(Если вы используете правильный элемент управления макетом, положения кнопок настраиваются правильно, если кнопка не отображается.)
Чтобы обеспечить поддержку более чем четырех сценариев, описанных выше, я добавил свойство CommandTitle
в DelegateCommand
, чтобы содержимое кнопки поступало оттуда.
Далее вам понадобится свойство Title
для заголовка диалога. Так что добавьте это в DialogVm
.
Если вы хотите закрыть диалоговое окно (только необходимо, если это дочерний элемент Window
), выполнив команду, вы можете выполнить этот подход. Конечно, я использовал ту версию, о которой писал там. Но другие тоже выглядят многообещающими.
Последняя открытая точка - это свойство, которое представляет различное содержимое диалогового окна. Если я правильно помню, я использовал небольшой набор моделей представления и соответствующий DataTemplates
(и, конечно, TemplateSelector
, который предоставляет правильный шаблон на основе типа виртуальной машины). Конечно, вам также понадобится ContentPresenter
элемент управления в вашем диалоге, который показывает DataTemplate
, предоставленный TemplateSelector
.
Это единственный недостаток, это только хороший подход, если у вас есть только несколько разных типов диалогов (например, окно вопроса, окно сообщения ...)
Использовать довольно просто. Просто инициализируйте экземпляр DialogVm
с желаемой логикой ICommand
, DialogContentVm (как бы вы его ни называли), передайте его в DialogWindow (возможно, вы хотите использовать sth (например, всплывающее меню) и представить его пользователю.
Надеюсь, это поможет. Если вам нужна дополнительная информация или помощь, пожалуйста, дайте мне знать.
person
DHN
schedule
04.01.2017