#c_sharp #wpf #xaml #mvvm
Подскажите как показать форму модально с учетом MVVM? Т.е. обычный ShowDialog не
подходит явно, т.к. не вписывается в паттерн.
Ответы
Ответ 1
Например так: Для диалогового окна у вас также должна быть вью-модель. В месте, где вы хотите показать диалог, создаете экземпляр этой вью-модели. Дальше может быть два варианта: а. Используя специальный сервис. У вас есть некоторый IDialogService, в котором вы можете зарегистрировать соответствие "вью / вью-модель" на этапе инициализации приложения, а также вызвать показ диалога, передав нужную вью-модель. Метод ShowDialog() при этом возвращает значения, аналогичные методу Window.ShowDialog(). Конкретный экземпляр IDialogService передается нужным вью-моделям извне (если вы используете DI) или просто создается по месту необходимости (что хуже). public interface IDialogService { void RegisterDialog(); bool? ShowDialog (TViewModel viewModel); } Пример реализации можно посмотреть в ответе VladD. б. Используя сообщения. У вас есть некоторое сообщение 'ShowDialogMessage', которое вы передаете мессенджеру. На это сообщение подписывается либо какое-то одно окно ("главное"), либо конкретные "родительские" окна. Зависит от желаемой степени детализации. Если при этом нужно получать "возвращаемое значение", то в сообщение нужно просто добавить соответствующее поле, которое будет заполняться в том месте, где сообщение обрабатывается. public class ShowDialogMessage : MessageBase { public TViewModel ViewModel { get; private set; } public SomeType Result { get; set; } public ShowDialogMessage(TViewModel viewModel) { ViewModel = viewModel; } } Касаемо мест, где создаются и показываются конкретные диалоговые окна. Их реализация может отличаться в зависимости от того, что вам нужно. Если диалоговое окно (и, соответственно, его вью-модель) у вас дженериковое (например, это просто мессадж бокс, с заголовком, текстом и типом), то это может быть одно место на все приложение. Если же диалоговые окна уникальные, то мест их показа будет несколько -- по месту на "тип" окна. Иногда это можно свести к одному месту, если использовать мапу "диалог / вью-модель" (см. метод RegisterDialog() в первом способе).
Комментариев нет:
Отправить комментарий