(注意:我选择不使用导航框架)
我有一个与WizardView链接的WizardViewModel WizardViewModel声明并实例化命令“Next” 它还包含Type SpellViewModel的属性“ActiveSpell”。
SpellViewModel包含几个PageViewModel,每个都有一个View对应物 ActivePage属性(在SpellViewModel上)告诉ui要采用哪个视图。
现在我有以下问题:
当我单击按钮切换到下一页时,
我需要访问WizardViewModel中定义的“Next”命令
但我只能访问那里的PageViewModel。
我可以为每个子ViewModel添加一个Parent属性,
但我不确定这是不是一个好主意
或许还有另一种更好/更常见的方法。
答案 0 :(得分:3)
您可以使用Event Aggregator来调整ViewModels之间的互动。
答案 1 :(得分:2)
您不需要Parent属性。您的视图模型结构很好,只需查看图片,了解如何将视图模型绑定到视图上:
下一个命令应该实现类似的东西:
public void NextExecute()
{
ActualSpell.MoveToNextPage();
}
<强>更新强> 根据你的评论,Arokh,我已经更新了帖子。 我认为,在这种情况下,你应该在WizardViewModel中实现ActivateCreatePersonSpell命令。这个命令应该:
您需要做的最后一件事是将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之前就已经完成了,但是经过一段时间我发现这种方法导致一些难以维护的代码,因为每个视图模型变得相互依赖。