一个视图中的viewmodel / entities或多个viewmodel的多个视图?

时间:2011-03-23 05:56:33

标签: wpf entity-framework mvvm

仍然试图找到更复杂的MVVM场景的好例子......

假设我有一个viewmodel - PlayersViewModel,它有一个Players集合。在一个视图中,我看到了玩家的集合并添加/编辑/删除。

另一种观点是团队,我将玩家分配给团队。所以我有另一个viewmodel - TeamsViewModel。此视图还需要一组玩家。如何使两个播放器列表保持同步,以便在两个视图中显示更改?

我看到了很多选择:

  1. 将PlayersViewModel的引用添加到我的团队视图(以及对TeamsViewModel的引用),并在两个视图中使用PlayersViewModel.Players集合
  2. 有两个不同的集合引用相同的底层集合实例(不知何故)
  3. 在Player模型上创建一个静态属性,如Player.All返回集合,viewmodels通过Player.Add(播放器),Player.Delete等管理Players而不是PlayersViewModel.AddPlayer(播放器)?
  4. 我现在倾向于#1并使用应用程序范围的资源,因此Team视图可以调用两个viewmodel。但是,如何在我的TeamsViewModel中的PlayersViewModel.Players集合中使用选定的玩家来添加它们?

    请帮助!!

3 个答案:

答案 0 :(得分:1)

我的硬性规则是每个View一个ViewModel,所以在我的书中你走的是正确的道路。不要将PlayersViewModel与玩家数据混淆:PlayersViewModel面向玩家视图,而不是玩家数据。换句话说,两者是分开的,因此您不需要在其他ViewModel中重用PlayersViewModel。如果我不能很好地解释这一点,我道歉......

如果您需要使用相同的数据实例显示多个ViewModel,请在App级别而不是Document级别定义数据。你可以让玩家静态,或者你可以让它实现Singleton模式:这些东西都不是特定于ViewModel的,因为ViewModel只是消耗资源。

答案 1 :(得分:0)

使用单个ViewModel。让不同的视图仅显示他们需要的内容。关于玩家的集合:WPF允许您拥有相同集合的多个视图,每个视图具有不同的过滤/排序/分组。请参阅Binding to Collections

答案 2 :(得分:0)

个人而言,为了更容易理解,每个视图都有一个视图模型。 这意味着每个自定义UserControl都有自己的ViewModel,处理自己的操作。 我正在开发一个包含大量视图的大项目,我认为每个视图都有一个ViewModel更清晰。它可以帮助我正确地阅读我的架构,因此我不会在一个独特的ViewModel中混合角色。

但是,我不能确保你这是最好的方法。我在两周前开始使用WPF / MVVM,我只是想通过这种方式更容易理解(我习惯将程序拆分成尽可能多的类,因为我觉得它更容易维护)