WPF: как закрыть диалог по нажатию кнопки - PullRequest
1 голос
/ 26 февраля 2011

Итак, у меня есть редактируемая ViewModel, где я не хочу, чтобы ее можно было редактировать только через диалоговое окно.

Обычно представление ViewModels показывает только данные, но вы можете нажать кнопку «Редактировать», которая открывает новуюОкно Xaml, вызывая window.showDialog ().Окно принимает ViewModel как DataContext, предоставляет свои свойства как редактируемые и привязывает команды Save и Cancel к кнопкам.

Все работает нормально, но у меня есть некоторые проблемы с этим.

Сначала команда сохранения работает, но она не закрывает диалоговое окно.Во-вторых, это как бы разрывает MVVM, потому что виртуальная машина должна знать представление EditDialog, чтобы создать его.

Также, что происходит, когда я нажимаю кнопку закрытия X.Я знаю, что Dialog обычно возвращает false как DialogResult, но здесь я не обрабатываю результаты.

Кто-нибудь делал что-то подобное, но элегантно, используя MVVM?

EDIT

Я также заметил, что если я использую .ShowDialog, я не могу ничего редактировать, даже если я выставляю как TextBoxes.Это из-за того, как модальные диалоги должны работать?

1 Ответ

2 голосов
/ 26 февраля 2011

Здесь я вижу два пути:

1) EditorVM ничего не знает о диалоге.В этом случае я бы оставил эту виртуальную машину в качестве простого редактора, который предоставляет свойства, но не имеет SaveCommand.Затем кнопка Save должна вводиться извне, где-то, где вы открываете диалог.Затем после закрытия диалога вы проверяете, был ли диалог закрыт с помощью кнопки Save или он был закрыт с помощью кнопки Cancel.Затем код, открывший диалоговое окно, должен проверить возвращенный результат и вызвать метод Save, если диалог был закрыт кнопкой Save.При таком подходе вам придется немного усложнить диалог - вам придется вставлять кнопки Save и Cancel из методов ShowDialog вместо того, чтобы тянуть их как часть ViewModel, которая будет отображаться.Но этот подход позволяет изолировать ваш EditorVM от любого поведения, специфичного для диалога.

2) EditorVM предполагает, что он был открыт в диалоговом окне, а в обработчике команды Save он сохраняет его содержимое и закрывает диалоговое окно.Чтобы получить доступ к функциональности диалога, я обычно использую какой-то сервис IWindowManager, который обрабатывает все открытые окна и может определить, какой диалог содержит какой viewModel, и может соответствующим образом закрыть их.В основном этот сервис IWindowManager имеет метод, подобный void CloseDialog(object ViewModel);.

...