Since the start of my WP7 app, I have leveraged IOC (specifically Ninject) to fill dependencies on my ViewModels following the MVVM Light samples. To briefly summarize, I have an app level resource called Locator which provides properties for each of my ViewModels. These properties get the instance from the IOC container.
Locator:
public class ViewModelLocator
{
public static IKernel Container { get; private set;}static ViewModelLocator()
{
Container = new StandardKernel(new ViewModelNinjectModule());
}public ITrackViewModel TrackViewModel { get { return Container.Get<ITrackViewModel>(); } }
}
public class ViewModelNinjectModule : NinjectModule
{
public override void Load()
{
Bind<ApplicationState>().To<ApplicationState>().InSingletonScope();
Bind<ITrackViewModel>().To<TrackViewModel>();
}
}
ViewModel:
public class TrackViewModel : ITrackViewModel
{
public TrackViewModel(ApplicationState appState)
{
ApplicationState = appState;
}
public ApplicationState { get; set; }
}
Ninject handles filling the constructor dependencies on my ViewModels. If I need to obtain data from a previous page, the ViewModel will have a constructor parameter of type ApplicationState. ApplicationState is a POC with properties for each bit of data that I need to pass between pages.
public class ApplicationState
{
public Customer SelectedCustomer { get; set; }
public IEnumerable<CartItem> CartItems { get; set; }}
So to share data between two pages I create a data property in ApplicationState, add an ApplicationState constructor parameter to each ViewModel and set/get the property appropriately. Only one instance of ApplicationState is created.
Kevin Wolf blogged about a NavDictionary he uses to pass state between pages. So if your not using MVVM this is an alternative solution.
Yup – that seems like a good approach when using MVVM in your app!