Как показать модальное окно?

197
08 октября 2018, 02:30

Подскажите как показать форму модально с учетом MVVM? Т.е. обычный ShowDialog не подходит явно, т.к. не вписывается в паттерн.

Answer 1

Например так:

  1. Для диалогового окна у вас также должна быть вью-модель. В месте, где вы хотите показать диалог, создаете экземпляр этой вью-модели.

  2. Дальше может быть два варианта:

    а. Используя специальный сервис. У вас есть некоторый 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;
        }
    }
    
  3. Касаемо мест, где создаются и показываются конкретные диалоговые окна. Их реализация может отличаться в зависимости от того, что вам нужно. Если диалоговое окно (и, соответственно, его вью-модель) у вас дженериковое (например, это просто мессадж бокс, с заголовком, текстом и типом), то это может быть одно место на все приложение. Если же диалоговые окна уникальные, то мест их показа будет несколько -- по месту на "тип" окна. Иногда это можно свести к одному месту, если использовать мапу "диалог / вью-модель" (см. метод RegisterDialog() в первом способе).

READ ALSO
Остановить Storyboard

Остановить Storyboard

Имеется юзерконтрол, который имеет поля имя, онлайн и тд

238
Конвертровать string[] в char[,]

Конвертровать string[] в char[,]

Есть некоторый массив строк:

196
C# спагетти из списков: оперативная память и производительность

C# спагетти из списков: оперативная память и производительность

Допустим есть 3 разных класса, A (родительский) и два наследника B и C

197
Изменение иконки в TreeViewItem

Изменение иконки в TreeViewItem

Имеется обычный TreeViewПри нажатии правой кнопкой мыши по treeviewitem вылезает меню (добавляет/удаляет запись в/из коллекции)

215