Prism コードサンプル学習:20-NavigationExistingViews
はじめに
以下の記事の続きです。
https://qiita.com/mngreen/items/cf6f758d04a0b6fa00f2
20-NavigationExistingViews
本サンプルは、前回記事と同じくボタンを押下するとタブコントロールにタブアイテムが追加されるサンプルです。
ボタンを押下するごとにタブのビューのカウントがインクリメントされます。
ただし、設定した回数(サンプルの場合は4回目)を超えると新しいタブが生成されます(正確には、そのVMと紐づくVがジャンプする対象とならない)。
以下のINavigationAware.IsNavigationTargetメソッドがtrueを返すかfalseを返すかで、タブが新しく生成されるかが変わります。
using Prism.Mvvm;
using Prism.Regions;
namespace ModuleA.ViewModels
{
public class ViewAViewModel : BindableBase, INavigationAware
{
private string _title = "ViewA";
public string Title
{
get { return _title; }
set { SetProperty(ref _title, value); }
}
private int _pageViews;
public int PageViews
{
get { return _pageViews; }
set { SetProperty(ref _pageViews, value); }
}
public ViewAViewModel()
{
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
PageViews++;
}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return PageViews / 3 != 1;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
}
}
今回のサンプルの変化点としては、VMでINavigationAwareインターフェイスを実現しており、IsNavigationTargetメソッド内の処理を変更している点です。
入口はこれまでに見たものと同じでRegionNavigationService.ExecuteNavigationメソッドから通ります。
この中のRegionNavigationContentLoader.LoadContentメソッドで、IsNavigationTargetメソッドでtrueが返らない場合、遷移先のViewが存在しないことになり、新たにViewを作成する処理に遷移することが分かります。
その結果として、モジュールのViewのインスタンスがどんどんと新たにできることが分かります。
おわりに
今回は、RegionManager.IsNavigationTargetメソッドの処理を変更することで、タブアイテムが増えていくサンプルを見ていきました。
前回と同じく、大きな流れ(クラス間の関連やメソッド呼び出し)はあまり大きく変わってはいませんでしたが、なぜViewが増えていくのかその中身に触れられました。
次回、21-PassingParametersについて見ていこうと思います。