Как я понимаю 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, ни здесь я не могу найти хорошее решение для этого.
Возможные решения, о которых я думал:
- Предоставьте доступ к модели, сохранив свойство для этого в каждом классе ViewModel.Но это вступает в противоречие с идеей скрыть модель от несанкционированного доступа.
- Реализуйте «public static GroupModel CreateGroup ()» в UserViewModel, потому что это имеет доступ к ее модели.Но это звучит немного грязно.
Как вы решили эту проблему?Я что-то пропускаю по MVVP-шаблону?