I’m trying to get MVVMLight working on Windows Phone 7 and having a small problem getting my head around the paradigm.
The scenario I think it should follow is:
1.) When the main view model loads, a message is sent via the MVVM Light Messenger to check for the presence of a database
2.) The message is received by the ViewModel and if there is not database, a message is sent back to the View via the messenger to show the install View (to navigate to it)
3.) The Installer View is shown by the first View
The problem seems to be the order in which events are called. The view successfully checks for the presence of a database and send the message, but the viewmodel hasn’t been initialized yet (breakpoint in constructor isn’t hit when the message is sent), so the form isn’t shown. Am I handling this the right way, or should I just check for the existence of the database in the View?
The Messenger can only send messages to objects that do exist in memory (side note, I am considering adding some “offline messenging” solution, but it is really only a vision, not even a blueprint yet).
In MVVM Light, the way the VM is wired to the view in XAML, the VM will be brought to life very early (as soon as InitializeComponent is hit in the code behind). If you need the VM to be created earlier, you can do so in the ViewModelLocator. I am going to show that at my MIX11 session (Deep Dive MVVM) so check the video when it is published (I will mention it on my blog http://blog.galasoft.ch).
If you are not using MVVM Light’s way of binding view and VM, and the VM does not exist in memory yet, one way is to “cache” the message for later. Create a lightweight object that exists solely for the purpose of receiving the message, and to store it. Then, when the VM is created, retrieve the message. it’s a message queue, if you want.
I hope that this helps,
Laurent