MVVM: проектирование архитектуры ViewModel с агрегированными / зависимыми моделями представления - PullRequest
2 голосов
/ 20 ноября 2010

Альфа-фанаты WPF / MVVM говорят:

1 Представление имеет 1 ViewModel.Иногда для нескольких представлений используется 1 ViewModel (с использованием Wizard ).

Если вы рассматриваете мое изображение, вы видите 6 цветных Views / UserControls.

ЖЕЛТЫЙ, ЗЕЛЕНЫЙ и ОРАНЖЕВЫЙ UserControlsиспользуются несколько раз в моем приложении.

Розовый, синий и красный пользовательские элементы управления используются только один раз.

Вопросы:

1. Должен ли ясделать их UserControls тоже?Если да, то почему, если я не буду их повторно использовать.

2. Предположим, что это 6 пользовательских элементов управления, должны ли они использовать один и тот же ViewModel?ИЛИ должен ли каждый View иметь свою собственную ViewModel?

A.) Создать код класса в ЗЕЛЕНОМ Отправьте код класса в ЖЕЛТЫЙ

B.) Выберите код класса в ЖЕЛТОМ Изменение текущего ученика в СИНИЙ

C.) Выберите текущего ученика в СИНИЙ. Изменить данные ученика в КРАСНО. Изменить документы ученика в ОРАНЖЕВЫЙ

D.) Создать ученика в ПИНК. Отправить ученика в СИНИЙ

E.) ... многоподробнее

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

Для меня есть большой недостаток:

Iсоздайте PupilViewModel, но я не знаю в NewPupilViewModel (PINK), существует ли SchoolClassCodeViewModel в ЖЕЛТОМ пользовательском контроле, чтобы я мог добавить свой новый PupilViewModel в СИНИЙ пользовательский контроль.

SchoolclassCodeViewModel 1: N PupilViewModel.

3. Как бы вы решили эту проблему?

alt text

1 Ответ

3 голосов
/ 20 ноября 2010

Подход Дэна во многом идентичен тому, что я собирался предложить.Чтобы ответить на конкретные вопросы:

1) Я бы сделал их UserControls, если есть какая-либо сложность их макета вообще.С одной стороны, проще делать все последовательно;с другой стороны, это облегчает работу с макетом этого элемента управления в Expression Blend без необходимости создания экземпляра всего окна.

2) Существует модель представления приложения для всего окна.Он содержит свойства для представлений, которым они нужны:

ObservableCollection<ClassCodeViewModel> ClassCodes
ClassCodeViewModel NewClassCode
ClassCodeViewModel SelectedClassCode
PupilViewModel NewPupil
PupilViewModel SelectedPupil

2A) ClassCodeViewModel предоставляет CreateCommand, который вызывает событие при его выполнении.Модель представления окна обрабатывает это событие и выполняет соответствующее обновление до ClassCodes, когда оно поднято.

2B) Модель представления кода класса содержит наблюдаемую коллекцию моделей представления ученика.Свойство SelectedItem в свойстве SelectedClassCode в модели представления окна, с которым связан SelectedItem в модели представления кода класса.Синий вид привязан к SelectedClassCode.Pupils.

2C) Аналогично, модель представления окна содержит свойство SelectedPupil, с которым связано свойство SelectedItem синего представления.Красный вид привязан к SelectedPupil.

2D) Это обрабатывается так же, как в 2A: модель вида зрачка вызывает событие, а модель вида окна обрабатывает его.

3) Модель представления зрачка содержит логическое свойство CanCreate.Это не используется в красном представлении.Модель представления окна устанавливает NewPupil.CanCreate в установщике SelectedClassCode.

Вы не спрашивали, но оранжевый вид привязан к свойству Documents SelectedPupil, что, вероятно, (зависит ото том, какие документы на самом деле являются) наблюдаемой коллекцией DocumentViewModel объектов.

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

...