将单个实例模型传递给同一模块中的多个视图模型以用于不同视图

时间:2011-08-18 01:08:38

标签: wpf mvvm prism

我正在开发一个使用PRISM的项目,我将导航实现为树视图,任何点击事件都会使用事件aggergation将事件引发到注册模块,该注册模块具有多个视图的多个视图模型(如向导应用程序,您可以通过许多观点来收集数据)。我希望有一个共同的,共享的或单一的模型,可以通过这个视图模型传递并保存到最后....用户可以随时点击任何链接的任何链接,它应该将数据保存到这个单例模型expsosed通过不同的视图模型。你有任何样品做这样的事情......或者你可以快速打一个关于怎么做的样品?或者根本不可能这样做。我正在遵循Brian Lagunas的Pluralsight Video for PRISM的所有模式,所以尽量使用这种方式....

3 个答案:

答案 0 :(得分:3)

我会有MasterViewModel来控制“向导”页面和当前状态

它将包含以下属性:

  • List<ViewModelBase> Pages
  • int CurrentPageIndex
  • ViewModelBase CurrentPage,返回Pages[CurrentPageIndex]
  • MyClass DataObject

MasterView一致的MasterViewModel只不过是ContentControl,其中ContentCurrentPage绑定。我可能还会在DataTemplates中定义MasterView,告诉WPF View哪个Page

您的MasterViewModel将负责处理页面,并向每个页面传递对所需数据的引用。例如,在构造函数中,它可能会说,

public MasterViewModel(MyClass dataObject)
{
    DataObject = dataObject;

    Pages.Add(new InfoPage(DataObject));
    Pages.Add(new AddressPage(DataObject.Addresses));
    Pages.Add(new PhonePage(DataObject.Phones));
    Pages.Add(new SaveMyClassPage(DataObject));

    CurrentPageIndex = 0;
}

如果您有兴趣,我会有一个例子here

答案 1 :(得分:0)

我不知道,无论是prism方式还是其他方式,当我构建类似向导的东西时,首先我创建向导收集的所有数据的实例。

public WizardData wd = new WizardData();

然后,向导的每一页都由这个wd实例初始化,即

public FirstWizardPage(WizardData wd)
{
    this.wizardData = wd;
}

因此,这种方式允许您在每个页面上都有按钮Finish。您可以使用ViewModel或其属性初始化wd

这种方式并不是最好的。它是一种可能的方式。

另一个 - 是创建单例并使用它而无需从页面到页面的引用传递。

答案 2 :(得分:0)

使用Prism时,您还有一个依赖注入容器,通常是Unity或MEF。要解决您的问题,您可以将模型注册为单个DI容器。要求DI容器解决其依赖性的每个视图模型,在我们的特殊情况下,模型将从DI容器中获取单例实例。

Unity示例:您将模型注册为单例实例:

public void Initialize( )
{
    container.RegisterInstance<Model>(new Model(), new ContainerControlledLifetimeManager( ));
}

现在,您可以在视图模型中解决依赖关系:

public ViewModel(IUnityContainer container)
{
    Model model = container.Resolve<Model>();
}