Newer
Older
SubCabinetSolution / SubCabinetSolution / ViewModel / ViewModelLocator.cs
/*
  In App.xaml:
  <Application.Resources>
      <vm:ViewModelLocator xmlns:vm="clr-namespace:"
                           x:Key="Locator" />
  </Application.Resources>
  
  In the View:
  DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName}"

  You can also use Blend to do all this with the tool's support.
  See http://www.galasoft.ch/mvvm
*/

using System;
using CommonServiceLocator;
using GalaSoft.MvvmLight.Ioc;
using GalaSoft.MvvmLight.Views;
using SubCabinetSolution.Utils;

namespace SubCabinetSolution.ViewModel
{
    /// <summary>
    /// This class contains static references to all the view models in the
    /// application and provides an entry point for the bindings.
    /// </summary>
    public class ViewModelLocator
    {
        private static ViewModelLocator _default;
        private static readonly object InstanceLock = new object();

        public static ViewModelLocator Default
        {
            get
            {
                if (_default == null)
                {
                    lock (InstanceLock)
                    {
                        if (_default == null)
                            _default = new ViewModelLocator();
                    }
                }

                return _default;
            }
        }

        /// <summary>
        /// Initializes a new instance of the ViewModelLocator class.
        /// </summary>
        public ViewModelLocator()
        {
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

            // 注册页面VM
            SimpleIoc.Default.Register<MainViewModel>(); //登录页
            SimpleIoc.Default.Register<CabinetViewModel>(); //主界面
            SimpleIoc.Default.Register<InquirePageViewModel>(); //查询Page页

            // 注册导航Service
            INavigationService navigationService = this.InitNavigationService();
            SimpleIoc.Default.Register(() => navigationService);
        }


        /// <summary>
        /// 创建NavigationService对象
        /// </summary>
        /// <returns>NavigationService</returns>
        private INavigationService InitNavigationService()
        {
            NavigationService service = new NavigationService();

            service.Configure("MainWindow",
                new Uri("/SubCabinetSolution;component/Views/MainWindow.xaml", UriKind.Relative));
            service.Configure("CabinetWindow",
                new Uri("/SubCabinetSolution;component/Views/CabinetWindow.xaml", UriKind.Relative));
            service.Configure("InquirePage",
                new Uri("/SubCabinetSolution;component/Views/InquirePage.xaml", UriKind.Relative));

            return service;
        }

        /// <summary>
        /// 导航Service
        /// </summary>
        // public INavigationService NavigationService => ServiceLocator.Current.GetInstance<INavigationService>();

        // 每个VM都需要生成对应的实例,不然会报空指针
        public MainViewModel MainWindow => ServiceLocator.Current.GetInstance<MainViewModel>();

        public CabinetViewModel CabinetWindow => ServiceLocator.Current.GetInstance<CabinetViewModel>();

        public InquirePageViewModel InquirePage => ServiceLocator.Current.GetInstance<InquirePageViewModel>();

        public static void Cleanup()
        {
            // TODO Clear the ViewModels
        }
    }
}