Выбор подходящей ViewModel, избегая больших условных выражений - PullRequest
0 голосов
/ 22 февраля 2012

Я пишу приложение WPF, в основном придерживаясь шаблона проектирования MVVM. Приложение имеет различные учебные модули, разбитые на разные категории, которые должны быть выполнены пользователем. Модули организованы в иерархическое меню. Мой ViewModel имеет класс с именем MenuPageViewModel, который предоставляет информацию, необходимую для визуализации MenuNode. Естественно, элементы терминала в дереве меню имеют контент, который я хотел бы показать пользователю. Этот контент может быть одним из множества различных типов модулей. В настоящее время, когда пользователь выбирает модуль в меню, я не вижу возможности использовать большой условный блок для определения того, какой тип ViewModel я хотел бы вернуть для отображения, основываясь на типе Content Property MenuItem. Например ...

if (CurrentlySelectedMenuItem.Content is Lesson)
                return new LessonViewModel(CurrentlySelectedMenuItem.Content as Lesson);
if (CurrentlySelectedMenuItem.Content is SkillsCheck)
                return new SkillsCheckViewModel(CurrentlySelectedMenuItem.Content as SkillsCheck);

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

Спасибо.

1 Ответ

0 голосов
/ 22 февраля 2012

Если вы используете Unity / Prism, то использование контейнера для разрешения объекта будет моим первым предпочтением.

_container.Resolve(Type.GetType(strObjectType)) as BaseViewModel;

где strObjectType - строка с типом класса, который вы хотите создать (например, "LessionViewModel")

если вы не используете Unity, то отражение работает

Activator.CreateInstance(strObjectType) as BaseViewModel;

с обоими решениями вам нужно иметь строку с типом класса в вашем menuItem.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...