0

我正在创建一个有很多不同页面的游戏。例如:登录页面、个人资料页面、玩家朋友编辑页面。

我是否为他们每个人创建一个 ViewModel?它们都是与模型“玩家”打交道的,只是在不同的方面。什么是常识?

4

5 回答 5

1

好吧,由于视图模型充当视图中模型的接口,因此任何时候视图需要以不同于任何其他视图的方式修改模型时,您都需要一个新的视图模型。

换句话说,即使不同的视图看起来可能不同,它与模型/视图模型的交互决定了是否需要新的视图模型。

于 2013-07-03T17:15:06.770 回答
1

如果您的页面包含大量内容,则将它们分解为子 VM 可能是有意义的。我尝试将 ViewModel 视为一个类,并且像任何其他类一样,如果它没有意义,你不希望它做所有事情。如果您的页面在逻辑上被分解为迷你视图,那么您应该能够轻松地将这些需求包含在子 VM 中。

例如:假设您有一个包含所有信息的编辑页面。也许用户信息(姓名、地址、电话号码)是一个虚拟机,工作历史是一个虚拟机,而爱好部分是一个虚拟机,而您的主虚拟机基本上完成了它周围的所有事情。您可以使用消息传递和/或事件来处理通信需求。

于 2013-07-03T17:18:51.857 回答
0

我会将 ViewModel 定义为视图抽象viewModel 应该包含属性和方法,这些属性和方法提供视图正常运行所需的数据行为。

鉴于这个定义,我的直觉是为每个视图提供一个单独的视图模型,因为它们每个都可能有自己独特的行为。

所有视图都依赖于同一个实体这一事实Player是一个实现细节,正如已经建议的那样,这个功能应该移到其他视图模型可以从中派生的基类中,类似于以下内容:

public abstract class ScreenViewModel : ViewModelBase // Implements INotifyPropertyChanged
{
    private Player _currentPlayer;

    public ScreenViewModel(IRepository<Player> playerRepository)
    {
        // Retrieve desired player from the repository.
        this._currentPlayer = playerRepository.Find(...);
    }

    // This is an idea of the sort of thing you can do; derived viewModels
    // do not need to worry about loading the player, they can just consume
    // it and provide the screen specific behaviour.
    protected Player CurrentPlayer
    {
        get { return _currentPlayer; }
    }
}

我不同意当前接受的答案中提供的建议,因为它是错误的;应该是您的视图塑造您的视图模型而不是您的数据库。数据库的设计应该对 viewModels 的设计几乎没有影响。在视图和域层之间有一个 viewModel 的全部意义在于使您的应用程序与较低层的更改隔离。

事实上,如果您查看我提供的示例 viewModel,它可以很好地与这些更改隔离开来。Player 通常会作为 POCO 公开(使其不了解持久性),并且提供对这些实体的访问的存储库隐藏在接口后面。

这意味着我可以更改数据库结构的实现方式,这些更改将被数据层吸收(例如,通过更改 Entity Framework 将表映射到应用程序中的实体的方式),并且 viewModel 不需要更改。您甚至可以更改持久性机制(IE 将数据保存到自定义文件而不是数据库),只要它将数据映射到PlayerPOCO 并且新存储库实现了IRepository<Player>接口,您的 viewModel 仍然可以按预期工作,证明数据库结构对视图模型的设计几乎没有影响。

于 2013-07-03T21:33:47.780 回答
0

当您想要创建包含另一个模型实例的模型时,ViewModel 很有用。例如,当您在一个模型和另一个模型(一个表和另一个)之间存在一对多关系并且需要在同一视图上显示这两个信息时,就是这种情况。甚至不一定是一对多,但情况往往如此。

如果您有一个包含从数据库中的表填充的值的下拉列表,但您的视图应该显示来自不同模型的所有其他信息,例如,您将在此示例中使用 ViewModel。

于 2013-07-03T20:52:24.573 回答
-1

这取决于您设计数据库的方式。如果您希望所有字段都在同一个表中,您可以将它们保持在同一个视图模型下,大多数情况并非如此,因为您不希望数据库中有任何冗余信息,并且您希望您的要规范化的数据库。因此,您可以根据您的数据库设计来构建模型,这样您的数据库就没有多余的信息。

于 2013-07-03T18:29:07.877 回答