据我了解MVVM,ModelX类的XViewModel应该将此类隐藏起来,以防止其他所有类的访问,以便XViewModel注意到对模型所做的所有更改。但是有一个问题,我无法解决。

想象一下,我有一些类(class):
ProjectModel,UserModel和GroupModel。
ProjectModel包含一个UserModel列表和一个GroupGroup列表,其中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。

我曾不止一次遇到这个问题,但是在Google上也遇到了麻烦,在这里我也找不到一个好的解决方案。

我考虑过的可能解决方案:
  • 通过在每个ViewModel类中都拥有一个属性来提供对模型的访问。但这与隐藏模型以防止未经授权的访问相冲突。
  • 在UserViewModel中实现一个“公共(public)静态GroupModel CreateGroup()”,因为它可以访问其模型。但这听起来有点脏。

  • 您是如何解决这个问题的?我会错过MVVP模式上的某些内容吗?

    最佳答案

    这样的事情怎么样:

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

    希望能帮助到你。

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

    关于c# - MVVM模式以及从ViewModel到Model的访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9516674/

    10-14 11:26
    查看更多