zoukankan      html  css  js  c++  java
  • 在MVVMLight框架的ViewModel中实现NavigationService

    网上已经有很多方法了,比如通过Messenger来实现等等。这里我只讲述一种我比较喜欢的方法,因为它很方便

    首先定义一个ViewModel基类,将所有ViewModel子类继承这个基类。在基类中定义

            protected bool RemoveBackEntry { get; set; }
            public NavigationService NavigationService { get; set; }
            public NavigationContext NavigationContext { get; set; }
            public virtual void OnNavigatedTo(NavigationEventArgs e) { }
            public virtual void OnNavigatingFrom(NavigatingCancelEventArgs e) { }
            public virtual void OnNavigatedFrom(NavigationEventArgs e)
            {
                if (RemoveBackEntry)
                {
                    RemoveBackEntry = false;
                    NavigationService.RemoveBackEntry();
                }
            }

    因为在MVVM中,我们将会在所有页面上都加上DataContext,只要拿到DataContext就能拿到ViewModel,所以我们就可以定义子类WPhoneApplicationPage来继承PhoneApplicationPage这个类。

        public class WPhoneApplicationPage : PhoneApplicationPage
        {
            protected WPhoneApplicationPage()
            {
                Loaded += PageBaseLoaded;
            }
    
    
            private void PageBaseLoaded(object sender, RoutedEventArgs e)
            {
                var viewModel = DataContext as ViewModel.ViewModel;
                if (viewModel != null)
                {
                    viewModel.NavigationService = NavigationService;
                }
            }
    
            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                base.OnNavigatedTo(e);
    
                var viewModel = DataContext as ViewModel.ViewModel;
                if (viewModel != null)
                {
                    viewModel.NavigationContext = NavigationContext;
                    viewModel.OnNavigatedTo(e);
                }
            }
    
            protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
            {
                base.OnNavigatingFrom(e);
                var viewModel = DataContext as ViewModel.ViewModel;
                if (viewModel != null)
                {
                    viewModel.NavigationContext = NavigationContext;
                    viewModel.OnNavigatingFrom(e);
                }
            }
    
            protected override void OnNavigatedFrom(NavigationEventArgs e)
            {
                base.OnNavigatedFrom(e);
                var viewModel = DataContext as ViewModel.ViewModel;
                if (viewModel != null)
                {
                    viewModel.NavigationContext = NavigationContext;
                    viewModel.OnNavigatedFrom(e);
                }
            }
        }

      这样在ViewModel中就可以调用NavigationService了。

      此外,还需要修改View,让View继承WPhoneApplicationPage

      xaml布局文件中

    1  <phone:WPhoneApplicationPage //修改PhoneApplicationPage 为 WPhoneApplicationPage
    2   xmlns:phone="clr-namespace:redrock.Core" //这里是你的WPhoneApplicationPage类所在的命名空间

      cs类文件中

    public partial class MainPage : WPhoneApplicationPage // 让MainPage继承WPhoneApplicationPage
    {
      public MainPage()
      {
        InitializeComponent();
      }
    }

      这样你可以在你的ViewModel中使用NavigationService以及重载 ViewModel基类中提供的导航方法

  • 相关阅读:
    优化网站性能的14条准则
    单元测试
    无配置wcf Host
    .net 4.0
    Java 7 resources
    关于重用
    用GMaven plugin更好地编译系统
    关于系统分层的自问自答
    UBIQUITOUS LANAGUAGE
    用Groovy方式实现接口便于单元测试和协作开发
  • 原文地址:https://www.cnblogs.com/toruneko/p/3278559.html
Copyright © 2011-2022 走看看