Search code examples
c#wpfmvvmmvvm-light

Best Practice to open a New Window in MVVM Light with Parameters


I am fairly new to mvvm and mvvm light, but I think I understand the general idea of it. What I don't understand is if I want to open a new window, but that window needs data from the caller what is the best practice to get that data to the new window? If I pass the data to the constructor then that means I need code in the code behind to pass it to the view model. I can't use messaging, because it isn't basic data.


Solution

  • One popular choice is to use a service class that will create a view/viewmodel and display the new view. Your view model constructor and/or method/property could receive the data from the caller and then the view would be bound to the viewmodel prior to displaying it on the screen.

    here is a very very simple implementation of a DialogService:

    public class DialogService : IDisposable
    {
        #region Member Variables
        private static volatile DialogService instance;
        private static object syncroot = new object();
        #endregion
    
        #region Ctr
        private DialogService()
        {
    
        }
        #endregion
    
        #region Public Methods
        public void ShowDialog(object _callerContentOne, object _callerContentTwo)
        {
            MyDialogViewModel viewmodel = new MyDialogViewModel(_callerContentOne, _callerContentTwo);
            MyDialogView view = new MyDialogView();
            view.DataContext = viewmodel;
    
            view.ShowDialog();
        }
        #endregion
    
        #region Private Methods
    
        #endregion
    
        #region Properties
        public DialogService Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (syncroot)
                    {
                        if (instance == null)
                        {
                            instance = new DialogService();
                        }
                    }
                }
                return instance;
            }
        }
        #endregion
    }