0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Prism コードサンプル学習:24-NavigationJournal

Posted at

Prism コードサンプル学習:24-NavigationJournal

はじめに

以下の記事の続きです。
https://qiita.com/mngreen/items/012d8605683a9e7cd873

24-NavigationJournal

本サンプルは、Personの一覧を表示するビューが表示されるサンプルになっており、その一覧の要素を選択するとそのPersonの詳細を表示するビューを表示します。
その表示されたビューの[Go Back]ボタンを押下すると一覧を表示するビューに戻り、[Go Forward]ボタンを押下するとさきほど表示していた詳細ビューを表示します。
つまり、戻る・進むボタンの実装にほぼ近いといえます。

とくに重要そうなのは、以下の処理の部分です。

...

namespace ModuleA.ViewModels
{
    public class PersonListViewModel : BindableBase, INavigationAware
    {
        IRegionNavigationJournal _journal;

        ...

        public DelegateCommand GoForwardCommand { get; set; }
        public PersonListViewModel(IRegionManager regionManager)
        {
            ...

            GoForwardCommand = new DelegateCommand(GoForward, CanGoForward);
        }

        ...

        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            _journal = navigationContext.NavigationService.Journal;
            GoForwardCommand.RaiseCanExecuteChanged();
        }

        ...

        private void GoForward()
        {
            _journal.GoForward();
        }

        private bool CanGoForward()
        {
            return _journal != null && _journal.CanGoForward;
        }
    }

    public class PersonDetailViewModel : BindableBase, INavigationAware
    {
        private Person _selectedPerson;
        IRegionNavigationJournal _journal;
        public Person SelectedPerson
        {
            get { return _selectedPerson; }
            set { SetProperty(ref _selectedPerson, value); }
        }
        public DelegateCommand GoBackCommand { get; set; }
        public PersonDetailViewModel()
        {
            GoBackCommand = new DelegateCommand(GoBack);
        }

        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            _journal = navigationContext.NavigationService.Journal;
            var person = navigationContext.Parameters["person"] as Person;
            if (person != null)
                SelectedPerson = person;
        }

        ...

        private void GoBack()
        {
            _journal.GoBack();
        }
    }
}

今回のサンプルでは、このIRegionNavigationJournalの責務がどのようなものか、また、このJournalというものを利用するとなぜ以前のビューに戻ることができるのかを読み進めようと思います。
経験的に、GoBackメソッドもGoForwardメソッドも似た内容だと思われるため、GoBackメソッドを取り上げて中身を見ていきます。
IRegionNavigationJournalを実現しているクラスを探すと、RegionNavigationJournalクラスが見つかりました。
GoBackメソッドをみてみるとIRegionNavigationJournalEntryをStackで持っており、そのEntryを利用することで以前のビューに戻る処理を実現しています。
では、そのStackに積まれているインスタンスをどのタイミングで、どのような情報を持たせているのかを確認します。
同クラスにRecordNavigationメソッドがあるため、その利用箇所を探すとRegionNavigationService.ExecuteNavigationメソッド内で利用されていることがわかります。
このメソッドを追っていくとRequestNavigateメソッドにまで到達します。上コード内では省略しましたが、実際にビュー遷移させるときにはこのメソッドを使っているため、利用者は意識せずにビューの遷移情報が蓄積される仕組みになっています。

おわりに

今回はRegionNavigationJournalクラスを読み進め、どのようにビューを戻す処理を実現しているのか読み進めました。
なるべく利用者には内側の仕組みを見せずに作るか、という点で勉強になりました。
次回、29-InvokeCommandActionについて見ていこうと思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?