使用在“父”ViewModel(MVVM)中声明的命令

时间:2011-11-16 17:53:53

标签: c# wpf mvvm command

(注意:我选择不使用导航框架)

我有一个与WizardView链接的WizardViewModel WizardViewModel声明并实例化命令“Next” 它还包含Type SpellViewModel的属性“ActiveSpell”。

SpellViewModel包含几个PageViewModel,每个都有一个View对应物 ActivePage属性(在SpellViewModel上)告诉ui要采用哪个视图。

现在我有以下问题:
当我单击按钮切换到下一页时,
我需要访问WizardViewModel中定义的“Next”命令 但我只能访问那里的PageViewModel。

我可以为每个子ViewModel添加一个Parent属性,
但我不确定这是不是一个好主意 或许还有另一种更好/更常见的方法。

3 个答案:

答案 0 :(得分:3)

您可以使用Event Aggregator来调整ViewModels之间的互动。

答案 1 :(得分:2)

您不需要Parent属性。您的视图模型结构很好,只需查看图片,了解如何将视图模型绑定到视图上:

enter image description here

下一个命令应该实现类似的东西:

public void NextExecute()
{
    ActualSpell.MoveToNextPage();
}

<强>更新 根据你的评论,Arokh,我已经更新了帖子。 我认为,在这种情况下,你应该在WizardViewModel中实现ActivateCreatePersonSpell命令。这个命令应该:

  • 保存实际法术状态
  • 打开CreatePerson拼写
  • 一旦创建了人,用创造者的结果设置了保存的法术

您需要做的最后一件事是将ActivateCreatePersonSpell命令绑定到页面上的按钮。我建议使用 ViewModelLocator 来实现这些目的。例如,查看this帖子。

答案 2 :(得分:1)

我必须实现一次向导,我喜欢和模仿Josh Smith和Karl Shifflett在这个示例项目中设置WizardViewModel和向导页面视图模型的方式(文章提供的源代码):

http://www.codeproject.com/KB/WPF/InternationalizedWizard.aspx

他们将Next命令保留为WizardViewModel的一部分,但创建了一个WizardPageViewModelBase,所有向导页面都来自该页面。这允许WizardViewModel控制哪个页面是当前页面,并允许WizardViewModel查询当前页面视图模型以查看Next命令是否可以执行,从而启用或禁用向导上的Next按钮。 (也就是说,向导视图模型知道页面视图模型,但页面视图模型不需要了解有关“父”向导视图模型的任何信息。)

至于添加到父视图模型的链接,这是一种有效的方法,并且在我开始使用MVVM之前就已经完成了,但是经过一段时间我发现这种方法导致一些难以维护的代码,因为每个视图模型变得相互依赖。