【问题标题】:MVVM Pattern and access from ViewModel to ModelMVVM 模式和从 ViewModel 到 Model 的访问
【发布时间】:2012-03-19 23:24:05
【问题描述】:

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

想象一下我有一些课程: 项目模型、用户模型和组模型。 ProjectModel 包含一个 UserModel 列表和一个 GroupModel 列表,其中包含一个 UserModel 列表。

对于所有这些类,都存在 ViewModel: 项目视图模型、用户视图模型、组视图模型。如果需要更改,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。

我不止一次遇到过这个问题,但无论是在谷歌上还是在这里我都找不到一个好的解决方案。

我想到的可能解决方案:

  1. 通过在每个 ViewModel 类中保存一个属性来授予对模型的访问权限。但这与隐藏模型以防止未经授权的访问的想法相冲突。
  2. 在 UserViewModel 中实现“公共静态 GroupModel CreateGroup()”,因为它可以访问其模型。但这听起来有点脏。

你是如何解决这个问题的?我是否错过了 MVVP 模式的某些内容?

【问题讨论】:

    标签: c# design-patterns mvvm


    【解决方案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。 Model 的创建不应该是 ViewModel 的责任。

    希望对你有帮助。

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

    【讨论】:

    • 在此示例中,您将 UserViewModels 传递给我认为是模型的 Group。这在我看来是不对的。
    • 我考虑过这一点,在我的情况下,这将解决问题,但一般不会。不能保证,我始终可以访问该模型。也许模型是外部库的一部分,我必须将它包装到 VM 中才能使 DataBinding 正常工作。在那种情况下,我的 GroupModel 没有构造函数(UserViewModel,UserViewModel),只有(UserModel,UserModel)
    猜你喜欢
    • 2018-03-11
    • 1970-01-01
    • 2018-06-03
    • 2010-10-23
    • 2015-07-14
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多