Кажется, что XAML в шаблоне MVVM испытывает затруднения для открытия Messageboxes. Мой клиент настаивает, что маркировки проверки и цвета не хороши для них. Они все еще хотят messagebox. Как может сделать это?
Я знаю, что могу открыть messageboxes в модели представления, но это нарушает целую цель для модели представления. Я могу также повысить ошибку и открыть messagebox в некоторых обработчиках исключений, но messagebox не является исключением. Это - часть нормального процесса выполнения программы.
Существует ли хороший способ сделать это в XAML? Моему клиенту нравится messageboxes. Она не заботится о шаблоне MVVM, у нее никогда не было качественной проблемы перед использованием MVVM и модульного теста. Но теперь, она даже не может получить свой messageboxes, таким образом, она не очень счастлива.
Я столкнулся с этой проблемой несколько недель назад. Я наткнулся на эту статью (http://blog.roboblob.com/2010/01/19/modal-dialogs-with-mvvm-and-silverlight-4/) и по сути следовал очень похожему процессу показа модальных диалогов с помощью паттерна MVVM. Для тестирования моих ViewModels я просто создал имитацию службы модального диалога.
У вас может быть событие PopUpNotificationRequested в вашей модели представления, которое будет обрабатываться представлением для отображения окон сообщений. Таким образом, логика отображения окна сообщений остается в модели представления, но по-прежнему не связана с представлением.
Одна из возможностей - использовать интерфейс для окна сообщений, например
public interface IMessageBoxProvider
{
MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult);
}
, и класс-оболочку, который реализует этот интерфейс и использует обычное или настраиваемое окно сообщений. Затем в модели просмотра вы можете использовать это
private IMessageBoxProvider MessageBox { get; set; }
, где MessageBox - это класс-оболочка. Итак, теперь вы развязали фактическое окно сообщений и теперь можете проводить модульное тестирование, а что нет.
Пример приложения ViewModel проекта WPF Application Framework (WAF) показывает, как показать MessageBox без нарушения паттерна MVVM.
Джоша Смита также есть статья CodeProject, которая может вас заинтересовать здесь.