在一个视图中的视图模型/实体或多个视图模型的多个视图?

问题描述:

仍试图找到更复杂的MVVM场景的好例子...在一个视图中的视图模型/实体或多个视图模型的多个视图?

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

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

我看到了一些选择:

  1. 添加到PlayersViewModel参考我的团队视图(以及以TeamsViewModel参考),并在这两种观点
  2. 有两台使用PlayersViewModel.Players集合引用相同的底层集合实例(在某种程度上)
  3. 不同集合创建像Player.All播放器模型,返回集合的静态属性和通过的ViewModels Player.Add(播放器),Player.Delete等管理玩家而不是PlayersViewModel.AddPlayer(播放器)?

我倾向于#1,并使用应用程序范围的资源,因此团队视图可以调用两个视图模型。但是,如何在我的TeamsViewModel的PlayersViewModel.Players集合中使用选定的播放器来添加它们?

请帮忙!

我坚强而快速的规则是每个视图都有一个ViewModel,所以在我的书中,您正处于正确的道路上。不要将PlayersViewModel与玩家数据混淆:PlayersViewModel面向玩家视图,而不是玩家数据。换句话说,两者是分开的,所以你不需要在其他ViewModel中重用PlayersViewModel。我道歉,如果我不解释这口井......

如果需要多个的ViewModels与数据的同一个实例来显示,然后在应用层面而非文档级定义数据。你可以让玩家静态,或者你可以让它实现Singleton模式:这些东西都不是特定于ViewModel的,因为ViewModel只消耗资源。

+0

感谢Joel,看来我正在朝着这个方向前进,并且将viewmodels映射到我的视图上。我的视图模型目前非常大,所以看起来我需要与我的视图模型和实体框架对象一起使用另一项服务 - 就像一个智能数据存储库,其中包含像当前的Players集合一样的东西。尽管EF在这里看起来似乎有些翻了一番,EF应该为我做些什么。 – DaveO 2011-03-24 08:43:19

+0

考虑添加您的ViewModel访问它所需类的服务层。该服务可以使用对EF的存储库模式,您可以使用DI设置它或使用上面讨论的其他方法之一。你的虚拟机不应该做所有的EF工作,它应该与那个层进行通信。 – 2011-03-24 14:23:03

使用单个ViewModel。让不同的视图只显示他们需要的东西。关于玩家的集合:WPF允许您拥有同一个集合的多个视图,并且每个视图都具有不同的过滤/排序/分组。见Binding to Collections

+0

您的意思是将PlayersViewModel和TeamsViewModel合并为一个视图模型?或者使用相同的viewmodel来引用Player集合?仍然不确定如何从我的TeamsViewModel(如果我们不合并)访问Player集合(或基于它的当前列表视图选择)。谢谢! – DaveO 2011-03-23 07:08:36

+0

是的,我的意思是结合两个视图模型。至于选择,为什么不在视图模型中添加属性并在玩家视图中绑定属性,即SelectedItem = {Binding SelectedPlayer}(当然,这仅适用于单选模式)。对不起我的英语不好 :)。 – 2011-03-23 07:34:00

+0

选择对于一个视图模型没有问题。但是,这是如何扩大的?即我们现在在视景模型和球员队伍中拥有一组球队,如果我需要一系列比赛,我也会把它放在视图模型中吗?这不会导致整个应用程序的一个超级viewmodel?谢谢! – DaveO 2011-03-23 07:42:00

Personnally,为了更容易理解,我每次观看一个视图模型。 这意味着每个自定义UserControl都有自己的ViewModel,处理它自己的操作。 我正在研究一个非常大的项目,并提供了很多视图,我认为每个视图都有一个ViewModel会更清洁。它帮助我正确地阅读我的架构,因此我不会将角色混合到独特的ViewModel中。

但是,我不能保证你是应该做的最好办法。我2个星期前开始在WPF/MVVM工作,我想通了,这将会是更容易这样理解(我用我的程序分成尽可能多的参加可能的,因为我认为这是更易于维护)