Prism и MVVM для нового проекта WPF - PullRequest
3 голосов
/ 30 августа 2010

Я скоро начну новый проект и ищу несколько архитектурных советов от тех из вас, кто имеет опыт работы с WPF, Prism и MVVM.

Проект определенно будет WPF, и я буду реализовыватьMVVM (я, вероятно, буду использовать MVVM Foundation Джоша Смита в качестве отправной точки), чтобы иметь возможность извлечь выгоду из разделения пользовательского интерфейса / логики и т. Д. Я не уверен, хотя мне было бы полезно использовать Prism для структурирования своего проекта.

Позвольте мне кратко описать проект.Там будет главная «панель инструментов», которая будет отображать количество виджетов.Каждый виджет отображает некоторые базовые данные, связанные с его функцией, и при щелчке на виджете открывается новое окно, в котором отображаются гораздо более подробные данные и содержится богатый пользовательский интерфейс для просмотра / редактирования данных.

Теперь я подумал, чтоЯ могу использовать Prism для создания проекта, но я никогда не использовал его раньше и не уверен, подходит ли он для того, чего я пытаюсь достичь.Например, будет ли моя «панель инструментов» оболочкой, содержащей области, которые будет заполнять каждый виджет?Будет ли каждое новое окно, отображаемое при нажатии на виджет, также представлять собой свою собственную оболочку с собственной настройкой региона?Если мне удастся получить шаблон для панели инструментов и одного виджета на панели инструментов, я смогу воспроизвести его для остальных виджетов.

Помимо Prism, у меня есть вопрос о том, как наверняка реализовать MVVMОкна редактирования данных.Допустим, у меня есть диаграмма, которая отображает некоторые данные, и пользователь может напрямую щелкнуть / переместить мышь по диаграмме, чтобы редактировать данные, которые он видит.Все данные находятся в модели, и модель представления делает эти данные доступными для представления посредством привязки.Мой вопрос: куда будут записываться события щелчка / перемещения мыши, которые относятся к диаграмме в этом представлении?Нам не нужно много / ничего в коде представления, и мы не хотим иметь обработчики событий пользовательского интерфейса в модели представления, поэтому я не уверен, как обрабатывается этот тип сценария.Я знаю, что здесь вероятны ответы на команды, но примеры MVVM, которые я видел, обычно показывают примеры команд для простых нажатий кнопок.Общая идея та же самая?

Итак, если у кого-то есть какие-либо предложения по поводу вышеизложенного или какие-либо общие советы по работе с WPF и MVVM / Prism, пожалуйста, дайте мне знать.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 30 августа 2010

Там есть несколько вопросов, поэтому я приложу все усилия, чтобы охватить их все.

Я работал над проектом, в котором были WPF, MVVM и Prism наряду с другими фреймворками.Лучший совет - понять мощь и функциональность каждого из них, прежде чем склеить их все вместе.Вам не нужно использовать все функции Prism, чтобы он был полезен в этой ситуации.

Для Prism вы можете использовать ...

  1. Оболочка и загрузчик для инициализацииприложение и загрузка модулей из других сборок.
  2. Создание и настройка Unity для внедрения зависимостей.Вы можете использовать другие DI-контейнеры.Здесь вы можете добавить глобальные сервисы, которые будет использовать каждый модуль.
  3. Использование EventAggregator для уведомления различных частей приложения, обычно между модулями и представлениями
  4. Области для именования областей в пользовательском интерфейсе, чтобы модули могли добавлятьвид на конкретное местоположение.

Приведенные выше 4 не обязательно должны использоваться, но их можно легко интегрировать в приложение MVVM / WPF.

Например, будет ли моя "панель инструментов" оболочкой, содержащей области, которые будет заполнять каждый виджет?

Здесь вы можете создать область, которую вы создаете (вы можете получить производнуюиз региона), который будет управлять кнопками на панели инструментов.(Я использовал регион в отношении ленты).Служба может быть представлена ​​через интерфейс, который каждый модуль может предоставить команду / образ (что бы у вас ни было), который при нажатии создаст ViewModel.Вы можете сделать это внутри Инициализации модуля.

Будет ли каждое новое окно, отображаемое при нажатии виджета, также представлять собой собственную оболочку с собственной настройкой региона?

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

<Window ...>
  <ContentControl Content="{Binding}" />
</Window> 

Где в вашем контроллере это можно сделать ...

public void DisplayView(ViewModel vm)
{
   var window = new MyWindow { DataContext = vm };
   window.Show();
}

Контроллер может использоваться непосредственно в вашем модулезавернутый в сервис ... хотя для тестабильности сервис и интерфейс были бы лучше.Убедитесь, что вы объединили ресурсы вашего модуля с Applicaiton.Resources и используете DataTemplate, чтобы связать ваше представление с моделью представления.

Мой вопрос: где будут события щелчка мышью / перемещения,писать что-то специфичное для диаграммы в этом представлении?

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

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

НТН

1 голос
/ 30 августа 2010

Я думаю, что Prism отлично подойдет для вас.

-> будет ли моя "панель инструментов" оболочкой, содержащей области, которые будет заполнять каждый виджет?

  1. Поместить одну область с ItemsControl в оболочку
  2. Создание модулей для каждого виджета
  3. Продолжайте добавлять модули виджетов в одну и ту же область оболочки itemscontrol.

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

-> Будет ли каждое новое окно, отображаемое при нажатии виджета, также представлять собой собственную оболочку с собственной настройкой региона?

Нет, вы можете использовать WindowRegionAdapter в оболочке для создания представлений для ваших виджетов в отдельных окнах.

-> куда будут записываться события щелчка / перемещения мыши, относящиеся к диаграмме в этом представлении?

Вы можете использовать прикрепленное поведение для привязки событий в вашем представлении к командам в ViewModel исключительно в XAML. Google "Смешать поведение" или "привязанные поведения", чтобы узнать, как вы могли бы сделать это. Для этого не нужно писать какой-либо код.

Если честно, я только пытаюсь дать вам ключевые слова, которые вы хотите найти, чтобы получить всю необходимую вам информацию.

...