ViewModel как член ViewModel

Я использовал MVVM Light Toolkit, чтобы помочь изучить шаблон MVVM. Однако мне не удалось решить проблему пользовательских элементов управления в сценарии элементов управления.

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

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

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

У меня он работает в ситуации с одним пользователем, используя глобальные переменные (через «сервис»). Однако с этим возникают проблемы с параллелизмом, и это не очень хорошее решение. Это ниже среднего.

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

Так. Кто-нибудь нашел чистый, совместимый с MVVM способ делать такие вещи?

Ваше здоровье


person onefootswill    schedule 30.03.2011    source источник


Ответы (3)


Пожалуйста, всегда помните, что MVVM — это просто шаблон, и он разработан, чтобы помочь вам разделить ваш пользовательский интерфейс и логику. Не бойтесь «нарушать шаблон», если это помогает повысить тестируемость или ремонтопригодность приложения.

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

Более того, если у вас действительно сложный пользовательский интерфейс с несколькими вложенными слоями пользовательского интерфейса, вы можете реализовать инфраструктуру для автоматической каскадной передачи всех событий от главной к дочерней виртуальной машине. И, конечно же, вы можете попробовать использовать один из более продвинутых фреймворков MVVM. Например, Catel реализует довольно комплексную модель для решения таких ситуаций с вложенными виртуальными машинами.

person Andrei Marukovich    schedule 30.03.2011
comment
Привет ЛунарФрог. Насколько я понимаю, Catel позволяет вам делать это, не имея ViewModels в качестве членов ViewModels. Мне было любопытно посмотреть, можно ли это сделать с помощью MVVM Light. - person onefootswill; 31.03.2011
comment
Внутренне Catel по-прежнему поддерживает цепочку ViewModels, чтобы иметь возможность пересылать события. Я думаю, вы можете эмулировать это, введя дополнительный объект, что-то вроде контроллера, для управления вашими виртуальными машинами. - person Andrei Marukovich; 01.04.2011
comment
Окей круто. Спасибо за совет. Я смотрел этот выпуск DNRTV dnrtv.com/default.aspx?showNum=182 в котором ведущий находится в лагере плохих идей. Он использует систему сообщений для передачи значений между ViewModels. Я все это учитываю. Я полагаю, что не смогу по-настоящему сформировать свое собственное мнение, пока не получу возможность поработать с ним над большим проектом (уроки, извлеченные через боль). - person onefootswill; 01.04.2011

Я не вижу проблемы с тем, что ViewModels ссылаются на другие ViewModels (исходя из моего опыта работы с TreeViews). Посмотрите любую статью о TreeView и MVVM. Вы увидите, что каждый узел является ViewModel, который ссылается на набор дочерних узлов, которые являются ViewModels. Попытка сделать это без ссылок VM-VM была бы кошмаром.

Джош Смит http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx

person djeeg    schedule 30.03.2011
comment
Спасибо джиг. Если у Джоша Смита есть точка зрения на этот вопрос, то я обязательно должен на это обратить внимание. Я прочитаю это сегодня вечером. - person onefootswill; 01.04.2011

Я использовал следующую настройку:

«Главная» виртуальная машина с виртуальной машиной «коллекция» и виртуальная машина «подробности» в качестве вложенных свойств.

Основная виртуальная машина привязана к представлению, которое используется в качестве основной формы. Это представление master-detail состоит из двух других представлений.

Я нахожу это очень аккуратной настройкой, потому что она позволяет мне поместить критерии поиска в главное представление (модель) и поддерживает чистоту других представлений (модели).

Я не понимаю, как это может нарушить шаблон.

person Emond Erno    schedule 01.04.2011