WPF MVVM — простое использование MessageBox.Show с помощью делегатов Action и Func
Автор: Дин (Dean) В мире MVVM такие вещи, как окна сообщений (MessageBox.Show) и диалоговые окна (открыть файл, сохранить файл и т. д.), выглядят неестественно. Эти всплывающие окна тесно связаны с частью View в MVVM, но фактически они могут быть вызваны только из ViewModel, что разрушает четкое разделение в MVVM. Если поискать сведения об этой проблеме, будет найдено множество искусных решений, многие из которых сами по себе являются значительными инженерными проектами. Я большой поклонник реализации максимально простых решений, так как многословный код является главным виновником появления проектов, которые нельзя поддерживать. Поэтому я занялся поиском решения, которое будет простым, надежным, элегантным и не разрушит модель MVVM. Решение, к которому я пришел — использовать делегаты Action и Func. А чтобы проиллюстрировать свое решение, я создал новый проект, используя пакет "WPF Model-View-ViewModel Toolkit", (https://wpf.codeplex.com/wikipage?title=WPF%20Model-View-ViewModel%20Toolkit), устанавливающий шаблон проекта в VS2008 Вот как выглядит мой измененный класс MainViewModel.cs.
Как можно видеть, конструктор MainViewModel принимает 2 делегата, 1 для всплывающего окна и 1 для подтверждения. Теперь взгляните на App.xaml.cs, в котором создаются экземпляры View и ViewModel.
При тщательном анализе видно, что мои делегаты фактически отображаются на методы статического класса MessageBox, который и даст нам нужные всплывающие окна. Делегат всплывающего окна popup создаст экземпляр простого всплывающего окна сообщения, а делегат окна подтверждения confirm создаст экземпляр всплывающего окна сообщения с кнопками подтверждения. И именно это происходит при выборе пункта меню Exit (выход). (Примечание. Это меню создается по умолчанию при создании нового проекта с помощью пакета.) Теперь, когда нужно запустить тесты для нашей модели ViewModel, можно просто передать в нее делегаты-заглушки.
Дин (Dean) |
Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.