3

我有一个正确的巴尼,让我了解如何使用 MVVM 模式将所有东西组合在一起。在实践中这一切似乎都很简单,但试图实现它我似乎打破了我尝试编码的各种其他规则。

顺便说一句,我正在尝试使用 Flex 来实现该模式,而不是 Silverlight 或 WPF,所以如果有人能提出不应该这样做的充分理由,那么我想听听他们的意见。

我有一个问题,我有几个观点。有时我必须同时在页面上显示两个视图;有时我会切换回单个视图。在我正常的 Flex 大脑中,我会有一个带有代码隐藏的主视图,其中包含我所有的其他视图(同样带有代码隐藏)。然后,该主视图将切换其他单独的视图。

当我尝试在 MVVM 中实现这一点时,我试图通过使用将 myViewsViewModels. 假设我创建了一个ViewModel应用程序范围的状态,并ApplicationView绑定到该数据并执行子视图的所有切换。

现在,我应该在哪里为我的子视图创建视图模型?我在里面试过ApplicationView——这似乎不对。然后我尝试在应用程序视图之外并将它的实例传递给ApplicationView然后我的子模型绑定到它。我错过了什么吗?这些方法似乎都不适合试图将其解耦的全部要点。

任何解释这个问题的好书或链接将不胜感激。

干杯,詹姆斯

4

3 回答 3

7

您指的方法是 ViewModel 组合。它有多个复杂的视图部件,需要绑定到它们自己的 ViewModel 实体。该方法需要为每个子 ViewModel 构建一个具有属性的根 ViewModel。然后根视图绑定到根视图模型,每个视图(无论是显示的还是折叠的)都绑定到根视图模型上的相应属性。

ViewModel 看起来像这样:

public class RootViewModel 
{
   ChildViewModelA ChildA { get; set; }
   ChildViewModelB ChildB { get; set; }
}

视图看起来像这样:

<Grid>
   <ChildViewA DataContext="{Binding ChildA}" />
   <ChildViewB DataContext="{Binding ChildB}" />
</Grid>

您也可以实现这一点,让自己选择一个活动的工作区。

ViewModel 看起来像这样:

public class RootViewModel 
{
   public List<ViewModel> ChildWorkspaces { get; set; }
   public ViewModel ActiveWorkspace { get; set; }

   public RootViewModel() 
   {
      ChildWorkspaces.Add(ChildViewModelA);
      ChildWorkspaces.Add(ChildViewModelB);
   }
}

视图看起来像这样:

<Grid>
   <Grid.Resources>
      <DataTemplate DataType="ChildViewModelA">
          <ChildViewA />
      </DataTemplate>
      <DataTemplate DataType="ChildViewModelB">
          <ChildViewB />
      </DataTemplate>
   </Grid.Resources>
   <ContentControl Content="{Binding ActiveWorkspace}" />
</Grid>

这将导致根据存储在 ActiveWorkspace 中的实际对象的类型隐式选择适当的视觉表示。

请原谅我的回答是在 WPF 中。我尽我最大的努力不被这一切的语法所困扰:-)

如您所见,多个“ViewModel”可能是模棱两可的。通常我们发现需要构建多个子实体来适当地构造 ViewModel。但是所有 ViewModel 实体都将位于根 View Model 对象中的某个位置。

在 WPF 中实现 MVVM 时,我更喜欢推断隐式应用数据上下文的可视元素(如本响应的后半部分所示)。在更复杂的场景中,我更喜欢使用 DataTemplateSelector 来进行决策。但在超级简单的情况下,您可以在 C#/ActionScript 中以命令方式或通过绑定以声明方式显式应用 DataContext。

希望这可以帮助!

于 2009-03-20T04:15:31.173 回答
3

我已经看到在几个不同的 Flex 项目中使用的 MVVM 方法的变体,但我还没有看到一种对我来说感觉完全正确的方法。也就是说,我认为使用 Presentation Models 可以使 Flex 中的测试变得更加容易,所以我很确定将会有更多的应用程序围绕这种模式设计。

我见过的在 Flex 中实现 MVVM 的最简单方法是将各个ViewModels 放在应用程序Model/ModelLoactor中。ModelLoactor包含任何全局数据,也可作为 all 的访问器ViewModels。然后可以通过ApplicationViews绑定到它们的特定对象,而可以通过命令和通过绑定到它们的父对象来更新。这种方法的一个好处是所有的数据逻辑都是本地化的。当然,这也可以看作是一个缺点,由于它对 all 的硬编码引用,中央有点脆弱。ViewModelModelLocatorViewModelsModelLocatorModelLocatorViewModels

我已经看到使用 Mate 框架可以使用更简洁的方法。Mate 允许更分散地注入ViewModels适当的ApplicationViews. (我想这也可以用 Swiz 来完成,我只是不熟悉那个框架)。使用 Mate,每个ApplicationViewViewModel通过 Map 注入。这种方法最酷的地方在于如何ViewModels使用 EventMap(a 的 Mate 版本FrontController)进行更新。本质上,您ApplicationViews将调度由一个或EventMaps多个ViewModels. 这种方法允许一个用户手势或事件一次ApplicationView改变几个状态ViewModels。另外,因为这个逻辑被提取到了 Mate 的EventMaps,更改事件的处理方式或更改的方式非常容易ViewModels。当然,这种方法的主要缺点是您承诺使用 Mate 作为框架,这可能不是一个选项,具体取决于项目的要求。

我希望这会有所帮助!

于 2009-03-17T13:59:23.417 回答
0

我想分享我写的 MVVM (Silverlight) 与 PresentionModel (Flex) 的比较。它显示了相同模式的两种实现如何不同/比较:

http://houseofbilz.com/archives/2010/12/29/cross-training-in-silverlight-flexmvvm-vs-presentation-model/

于 2011-02-09T11:42:32.150 回答