开发者

Pass Single Instance of Model to Multiple View Models in same Module for different views

开发者 https://www.devze.com 2023-03-29 09:46 出处:网络
I am working on a project using PRISM where I have left navigation implemented as Tree View and any click event happens raise event using event aggergation to Enrolment Module which has multiple view

I am working on a project using PRISM where I have left navigation implemented as Tree View and any click event happens raise event using event aggergation to Enrolment Module which has multiple view model for multiple views (like Wizard Applicaiton where you can go through many views to collect data). I want to have a common or shared or singleton model which can be passed across this view models and save at the end.... users can click on any link any navigation at any time and it should save data in to this singleton model expsosed through different view model. Do you have any samples which are doing something like开发者_如何学Go this... or can you type up a quick one on how to do it? OR it is not possible to do it at all. I am following all patterns from Brian Lagunas's Pluralsight Video for PRISM so try to use that way....


I would have a MasterViewModel which controls the "wizard" pages and current state

It would contain the following properties:

  • List<ViewModelBase> Pages
  • int CurrentPageIndex
  • ViewModelBase CurrentPage, which returns Pages[CurrentPageIndex]
  • MyClass DataObject

The MasterView that goes with the MasterViewModel would be nothing more than a ContentControl with it's Content bound to CurrentPage. I would probably also define DataTemplates in the MasterView which tells WPF which View to draw with which Page

Your MasterViewModel would be in charge of handling the pages, and passing each page a reference to the data it needs. For example in the constructor it might say,

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;
}

I have an example here if you're interested


I don't know, is it prism way, or something another, when I build something like wizard, first of all I create instance of all data which wizard collect.

public WizardData wd = new WizardData();

Then, every page of wizard are initialized by this wd instance, i.e.

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

So, this way allow you to have button Finish on every page, for example. You can initialize your ViewModel with wd, or its properties.

This way is not the best. Its hust one of the possible way.

Another - is to create singleton and use it without reference passing from page-to-page.


When you use Prism you also have a Dependency Injection Container, usually Unity or MEF. To solve your problem you can register your model as singleton to those DI containers. Every view model that asks the DI container to resolve their dependecy, in our special case the model, will get the singleton instance back from the DI container.

Unity example: You register your model as singleton instance:

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

Now you can resolve your dependencies in your view model:

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号