MVVM模式以及从ViewModel到Model的访问

时间:2012-03-01 13:00:02

标签: c# design-patterns mvvm

当我理解MVVM时,ModelX类的XViewModel应该隐藏这个类以防止访问所有其他类,以便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无法访问UserViewModel的字段_user,因此无法创建自己的字段_groupModel。

我曾经多次面对这个问题,但谷歌还没来到这里我找不到一个好的解决方案。

我想到的Possibilie解决方案:

  1. 通过在每个ViewModel类中保存属性来访问模型。但这与将模型隐藏在未经授权的访问中的想法相冲突。
  2. 在UserViewModel中实现“public static GroupModel CreateGroup()”,因为它可以访问其模型。但这听起来有点脏。
  3. 你是如何解决这个问题的?我是否想念MVVP模式?

1 个答案:

答案 0 :(得分:1)

这样的事情怎么样:

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的责任。

希望它有所帮助。

编辑:修复了用户实例的创建问题。