我正在开发一个使用PRISM的项目,我将导航实现为树视图,任何点击事件都会使用事件aggergation将事件引发到注册模块,该注册模块具有多个视图的多个视图模型(如向导应用程序,您可以通过许多观点来收集数据)。我希望有一个共同的,共享的或单一的模型,可以通过这个视图模型传递并保存到最后....用户可以随时点击任何链接的任何链接,它应该将数据保存到这个单例模型expsosed通过不同的视图模型。你有任何样品做这样的事情......或者你可以快速打一个关于怎么做的样品?或者根本不可能这样做。我正在遵循Brian Lagunas的Pluralsight Video for PRISM的所有模式,所以尽量使用这种方式....
答案 0 :(得分:3)
我会有MasterViewModel
来控制“向导”页面和当前状态
它将包含以下属性:
List<ViewModelBase> Pages
int CurrentPageIndex
ViewModelBase CurrentPage
,返回Pages[CurrentPageIndex]
MyClass DataObject
与MasterView
一致的MasterViewModel
只不过是ContentControl
,其中Content
与CurrentPage
绑定。我可能还会在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>();
}