简体   繁体   中英

How to reference a viewModel object in ViewModelLocator in MVVM Light

I'm trying to do some clean-up when my WPF app is closed. I know the ViewModelLocator.Cleanup() is getting called when the app shuts down, but I need to call the Cleanup method I have defined in my AvigilonViewModel class. The creation of an instance of AvigilonViewModel is not something I recognise, and I cant figure out how to use it.

ViewModelLocator.cs....

namespace Module.Config.ViewModel
{
    public class ViewModelLocator
    {
        static ViewModelLocator()
        {
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

            if (ViewModelBase.IsInDesignModeStatic)
            {
                //SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
            }
            else
            {
                //SimpleIoc.Default.Register<IDataService, DataService>();
            }

            SimpleIoc.Default.Register<AppState>();

            SimpleIoc.Default.Register<MainViewModel>();
            SimpleIoc.Default.Register<AvigilonViewModel>();
        }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
            "CA1822:MarkMembersAsStatic",
            Justification = "This non-static member is needed for data binding purposes.")]
        public MainViewModel Main
        {
            get
            {
                return ServiceLocator.Current.GetInstance<MainViewModel>();
            }
        }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
            "CA1822:MarkMembersAsStatic",
            Justification = "This non-static member is needed for data binding purposes.")]
        public AvigilonViewModel Avigilon
        {
            get
            {
                return ServiceLocator.Current.GetInstance<AvigilonViewModel>();
            }
        }

        /// <summary>
        /// Cleans up all the resources.
        /// </summary>
        public static void Cleanup()
        {
            Avigilon.Cleanup();
            /* I get error: An object reference is required for 
               the non-static field, method, or property
               'Module.Config.ViewModel.ViewModelLocator.Avigilon.get'  
            */
        }
    }
}

This similar question seems relevant but I get more erros when I try to implement it (I will post errors if required)... How to force Cleanup() for all my ViewModels

UPDATE - FOR ANSWER FROM har07

ViewModelLocator.cs....

namespace Module.Config.ViewModel
{
    public class ViewModelLocator
    {
        static ViewModelLocator()
        {
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

            if (ViewModelBase.IsInDesignModeStatic)
            {
                //SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
            }
            else
            {
                //SimpleIoc.Default.Register<IDataService, DataService>();
            }

            SimpleIoc.Default.Register<AppState>();

            SimpleIoc.Default.Register<MainViewModel>();
            SimpleIoc.Default.Register<AvigilonViewModel>();
        }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
            "CA1822:MarkMembersAsStatic",
            Justification = "This non-static member is needed for data binding purposes.")]
        public MainViewModel Main
        {
            get
            {
                return ServiceLocator.Current.GetInstance<MainViewModel>();
            }
        }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
            "CA1822:MarkMembersAsStatic",
            Justification = "This non-static member is needed for data binding purposes.")]
        public AvigilonViewModel Avigilon
        {
            get
            {
                return ServiceLocator.Current.GetInstance<AvigilonViewModel>();
            }
        }

        public static void Cleanup()
        {
            Messenger.Default.Send<CleanUp>(new CleanUp());
        }
    }
}

AvigilonViewModel.cs....

namespace Module.Config.ViewModel.Modules
{
    public class AvigilonViewModel : ViewModelBase
    {
    . . . 

        public AvigilonViewModel(AppState state)
        {
            Messenger.Default.Register<CleanUp>(this, CallCleanUp);
            . . . .
        }

        private void CallCleanUp
        {
           /* do actual cleanup */   
        }
    }
}

But what is CleanUp ?

Aviglion.Cleanup() in your code will call getter of Aviglion which is invalid call as the error message suggested, because the getter is not static and being called from a static method. More importantly, I believe that isn't what you meant to do.

Answer to the question you linked suggests that the way is by sending a clean up message to your AvigilonViewModel :

public static void Cleanup()
{
    Messenger.Default.Send<CleanUp>(new CleanUp());
}

..and make AvigilonViewModel listen to that particular message so it can responds the message by cleaning it self, for example :

public class AvigilonViewModel : ViewModelBase
{
    public AvigilonViewModel()
    {
        Messenger.Default.Register<CleanUp>(this,CallCleanUp);
    }
    private void CallCleanUp()
    {
        //do the actual cleaning up here
        Cleanup();
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM