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基类中提供的导航方法

  • 相关阅读:
    LeetCode OJ:Merge Two Sorted Lists(合并两个链表)
    LeetCode OJ:Remove Nth Node From End of List(倒序移除List中的元素)
    LeetCode OJ:Find Peak Element(寻找峰值元素)
    LeetCode OJ:Spiral MatrixII(螺旋矩阵II)
    LeetCode OJ:Longest Palindromic Substring(最长的回文字串)
    利用生产者消费者模型实现大文件的拷贝
    Linux下用c语言实现whereis.
    Huffman编码实现文件的压缩与解压缩。
    修改MySQL数据库存储位置datadir
    python中pickle简介
  • 原文地址:https://www.cnblogs.com/toruneko/p/3278559.html
Copyright © 2011-2022 走看看