Является ли шаблон MVVM нарушенным?
У меня есть WPF-приложение на основе MVVM-Pattern. Все работает нормально. В бизнес-логике View-Model мне нужно вызвать некоторые диалоги. Я реализовал его через интерфейс (реализация интерфейса находится в слое "Вид" ). Для диалогов мне нужно установить родительское окно, поэтому функция в интерфейсе имеет аргумент "parentView".
В моей модели ViewModel у меня есть свойство "Просмотр" из типа "объект" для родительского окна. Это свойство я ставлю в качестве аргумента для создания экземпляра диалога.
Так как свойство "Вид" относится к типу "объект" и устанавливается из слоя "Вид" и перенаправляется обратно на уровень "Вид" , уровень "Модель" не имеет зависимостей от слоя "Вид" .
Как вы думаете, сломал ли MVVM-шаблон?
Ответы
Ответ 1
Как вы думаете, сломал ли MVVM-шаблон?
Нет. Модель просмотра не зависит от представления, она знает только об интерфейсе, который вы могли бы легко высмеять в своих модульных тестах. Таким образом, это действительно не нарушает шаблон, если "Просмотр" - это просто абстракция чего-то.
По причинам безопасности по типу вам, вероятно, следует, однако, рассмотреть возможность изменения типа параметра с object
на строго типизированный тип интерфейса.
Ответ 2
Нет друга - это решаемая проблема.
Я имею в виду, что нет никакой реальной красоты во всех решениях, но вы могли бы использовать Dialog-Service, например.
Реальная простая реализация на этом будет Singleton
, у которой есть статическое поле с вашим Main- Window
. Теперь вы можете вызвать свои диалоги из этого класса.
Я на самом деле думаю, что MahApps, например, идет так, но они регистрируют это причудливо:
<controls:MetroWindow
x:Class="SomeMetroWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls"
xmlns:Dialog="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro"
Dialog:DialogParticipation.Register="{Binding}"> <!-- watch this pls --->
<!-- ... --->
</controls:MetroWindow>
Ниже приведен пример для общей реализации. И здесь еще arcticle об арктиках этой темы.
Как я уже сказал - не очень красиво, но решено.