如何在MVVM Light中的ViewModelLocator中引用viewModel对象

时间:2014-07-05 22:16:42

标签: c# mvvm-light

当我的WPF应用关闭时,我正在尝试进行一些清理工作。我知道ViewModelLocator.Cleanup()在app关闭时被调用,但是我需要调用我在AvigilonViewModel类中定义的Cleanup方法。创建一个AvigilonViewModel实例并不是我认识的,我无法弄清楚如何使用它。

... 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'  
            */
        }
    }
}

这个类似的问题看似相关,但是当我尝试实现它时,我会得到更多的错误(如果需要,我会发布错误)...... How to force Cleanup() for all my ViewModels

更新 - 来自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 */   
        }
    }
}

但是CleanUp是什么?

1 个答案:

答案 0 :(得分:0)

您的代码中的

Aviglion.Cleanup()将调用Aviglion的getter作为错误消息建议的无效调用,因为getter不是静态的并且是从静态方法调用的。更重要的是,我认为这不是你的意思。

对您关联的问题的回答表明,方法是向您的AvigilonViewModel发送清理邮件:

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

..并使AvigilonViewModel听取该特定消息,以便它可以通过自我清理来响应消息,例如:

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