Является ли шаблон 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 об арктиках этой темы.

Как я уже сказал - не очень красиво, но решено.