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