Шаблон MVVM и доступ из ViewModel в Model - PullRequest
3 голосов
/ 01 марта 2012

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

Представьте, что у меня есть несколько классов: ProjectModel, UserModel и GroupModel.ProjectModel содержит список UserModel, а список GroupModel - это список UserModel.

Для всех этих классов существуют ViewModels: ProjectViewModel, UserViewModel, GroupViewModel.ProjectViewModel оборачивает весь список моделей в ObservableCollection, если изменения необходимы, в противном случае в ReadOnlyCollection.В моем случае это ObservableCollection.

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

UserViewModel user1 = new UserViewModel("Chriss");
UserViewModel user2 = new UserViewModel("Jena");
ProjectViewModel project = new ProjectViewModel();
project.Groups.Add(new GroupViewModel(user1, user2));

Теперь конструктор GroupViewModel должен создать свое поле _groupModel, вызвав конструктор GroupModel:

public GroupModel(UserModel user1, UserModel user2){}

Но, к сожалению, GroupViewModel не имеет доступа кполе _user из UserViewModel и поэтому оно не может создать свое собственное поле _groupModel.

Я сталкивался с этой проблемой более одного раза, но ни в Google, ни здесь я не могу найти хорошее решение для этого.

Возможные решения, о которых я думал:

  1. Предоставьте доступ к модели, сохранив свойство для этого в каждом классе ViewModel.Но это вступает в противоречие с идеей скрыть модель от несанкционированного доступа.
  2. Реализуйте «public static GroupModel CreateGroup ()» в UserViewModel, потому что это имеет доступ к ее модели.Но это звучит немного грязно.

Как вы решили эту проблему?Я что-то пропускаю по MVVP-шаблону?

1 Ответ

1 голос
/ 01 марта 2012

Как насчет этого:

var user1 = new User("Chriss");
var user2 = new User("Jena");
var userModel1 = new UserViewModel(user1);
var userModel2 = new UserViewModel(user2);
var group = new Group(userModel1 , userModel2);
var project = new ProjectViewModel();
project.Groups.Add(new GroupViewModel(group));

Итак, вы создаете группу извне и передаете ее в GroupViewModel. Создание модели не должно быть обязанностью ViewModel.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: Исправлено создание экземпляра пользователя.

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