Конструкторы ViewModel - PullRequest
       22

Конструкторы ViewModel

0 голосов
/ 23 марта 2012

У меня еще одна попытка использовать приложение WPF, включающее Prism & MEF, и пытаюсь лучше понять шаблон MVVM. Я делал это раньше, и, хотя у меня есть рабочее решение, которым я доволен, я не уверен, что остался верен шаблону MVVM, так как в результате я получил модели представления, раскрывающие множество обработчиков событий и код, стоящий на представления, обрабатывающие эти события. Эти события были направлены главным образом на открытие дополнительных представлений (таких как диалоговые окна редактирования) на основе выбора, сделанного в начальном представлении.

Пока (на этот раз) я создал приложение оболочки с PRISM, у меня есть несколько регионов, и я могу создавать представления и добавлять их в эти регионы. Я также использую MEF для модульного решения, а также для автоматического предоставления моделей представлений представлениям через IoC. Опять же, это работает - в точку ...

Моя проблема связана с созданием некоторых моделей представлений. До сих пор я создал модели, которые содержат списки из баз данных. Они работают, и до сих пор большая часть кода у меня есть и дополнительный конструктор с атрибутом [ImportingConstructor], который гарантирует, что я получу модель представления. Я доволен этим на данный момент (но могу посмотреть варианты позже).

Мой следующий шаг - предоставить новый вид для редактирования элемента в одном из списков (это в основном классический основной список, открывающий диалоговое окно редактирования). Вот где я не могу увидеть MVVM / MEF способ сделать что-то - я не могу найти способ передать параметр конструктору модели представления на основе текущего выбранного элемента в списке.

Я знаю, что пытаюсь быть здесь пуристом. Я также знаю, что в коде нет ничего плохого. Однако я пытаюсь понять, можно ли достичь реализации утопии.

Итак, как бы вы поступили об этом ...

Для заданного списка с выбранным элементом откройте новое представление (InteractionRequest?) С моделью представления, которая содержит либо (a) фактический элемент, выбранный в списке, либо (b) хотя бы некоторую ссылку на него, либо одно из его свойств, которое можно использовать для повторного получения элемента из хранилища данных?

Ответы [ 2 ]

0 голосов
/ 24 марта 2012

Я постараюсь ответить на ваши вопросы здесь:

  1. Чтобы позаботиться о всплывающих окнах и т. Д. Способом MVVM - проверьте различные реализации Interaction.По сути, у вас есть Behavior, подключенный к XAML и связанный с каким-либо сервисом на ВМ.

  2. Чтобы позаботиться о дополнительных действиях после построения ВМ - это распространеноиспользовать метод Start() на ВМ и вызывать его в вашем представлении сразу после создания ВМ.

  3. Для передачи параметров между представлениями - PRISM имеет INavigationAware, и вы можете передавать простые строки запроса междуПредставления

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

0 голосов
/ 24 марта 2012

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

Что я обычно делаю (используя Unity), либо создаю дочерний контейнер и регистрирую экземпляр класса, который я хочу предоставить модели представления, с дочерним контейнером, используя ContainerControlledLifetimeManager (что в Unity означает, чтоконтейнер всегда будет возвращать один и тот же экземпляр при запросе).Я обычно делаю это, когда другим вещам, так сказать, «вниз по дереву», понадобится один и тот же экземпляр класса.

Другой метод - это использование переопределений параметров, которые инструктируют «единство» для «передачи этого значения параметру конструктора».под этим именем ".Похоже, что этот вопрос здесь, чтобы рассказать вам, как вы могли бы сделать это с MEF: MEF Constructor Injection

Я думаю, вы на правильном пути, честно говоря, я бы посмотрел на избавление от MEFи используя настоящий контейнер IoC.

Вы правы, однако, вы, вероятно, не сможете обойтись без 100% -ной реализации MVVM в реальном приложении.У меня есть очень большое приложение WPF, над которым я работаю, и в некоторых местах MVVM просто не имеет смысла, обычно, когда вы входите в простые диалоги и «всплывающие окна».

...