Передача параметров в оболочку Viewmodel с использованием Unity BootStrapper с Prsim - PullRequest
0 голосов
/ 14 октября 2018

Я создал диалоговую службу, использующую интерфейсы для отображения пользовательских диалоговых окон / окон подтверждения (я знаю, что Prism поставляется с этой возможностью, но диалоговые окна не выглядят настраиваемыми и не соответствуют моей компоновке / цветовой схеме),У службы диалога есть функция регистрации, которая регистрирует тип представления диалога с типом модели представления диалога в словаре.Это сделано для того, чтобы модель представления могла быть передана и в слабосвязанной форме, экземпляр необходимого представления может быть создан.Код выглядит следующим образом:

    private readonly IDialogService dialogService = new DialogService(Application.Current.MainWindow);

    // Registers the confirmation window viewmodel with the confirmation window view
    dialogService.Register<ConfirmationWindowViewModel, ConfirmationWindow>();

, поэтому моей первоначальной мыслью было попытаться создать его в загрузчике Unity (из-за регистрации в представлениях и моделях представления), но я не могу найти способсделать это и передать в диалоговом сервисе.

Я должен отметить, что конструктор для модели представления главного окна также внедряет менеджер региона и агрегатор событий для Prism;Я попытался создать экземпляр в загрузчике и зарегистрировать экземпляр, но создание диспетчера регионов против внедрения вызывает ошибки.Если я объявляю и инициализирую сервис диалога в модели представления главного окна, он, конечно, работает, но из моего понимания MVVM мы не хотим, чтобы модели представления имели какие-либо знания о представлениях, поэтому я пытаюсь найти другой способ сделать это,не нарушая IoC для менеджера регионов и агрегатора событий.

Я новичок в MVVM и Prism / Unity, поэтому мое понимание этих концепций еще не полностью закреплено.

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Я знаю, что Prism поставляется с этой способностью, но диалоговые окна не выглядят настраиваемыми и не соответствуют моей раскладке / цветовой схеме

Вы можете создавать все что угоднов качестве диалога просто извлеките из PopupWindowAction и переопределите CreateWindow (и другие методы по мере необходимости), чтобы создать диалоговое окно, которое вы всегда хотели.

0 голосов
/ 14 октября 2018

В случае, если кто-нибудь увидит это позже и будет любопытно, моим конечным решением было полностью избавиться от функции «Регистрация» в пользу твердого соглашения.

Раньше я использовал эту функцию и сохранялсловарь всех зарегистрированных view / viewmodels:

    dialogService.Register<ConfirmationWindowViewModel, ConfirmationWindow>();

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

Шаг 1. Убедитесь, что все представления названы с суффиксом View в конце.Шаг 2: Убедитесь, что все модели представления названы с суффиксом ViewModel в конце.Шаг 3: Убедитесь, что все они находятся в пространствах имен с соответствующими именами (представления в пространстве имен представлений и модели представления в пространстве имен представлений).

(большая часть этого ^^ в любом случае выполняется)

Последний шаг: замененный словарьс этим кодом:

        var viewTypeName = viewModel.GetType().AssemblyQualifiedName.Replace("Model", ""); 
        var viewType = Type.GetType(viewTypeName);

в диалоговом интерфейсе.Теперь, независимо от того, какая модель представления передается, она будет извлекать соответствующее представление с меньшим количеством кода и без необходимых ссылок, как было сделано ранее.

...