Prism コードサンプル学習:22-ConfirmCancelNavigation
はじめに
以下の記事の続きです。
https://qiita.com/mngreen/items/5493d8c16245e2fc36e4
22-ConfirmCancelNavigation
本サンプルは、他ビューへの遷移する前に本当に移動するかを確認するダイアログを表示するサンプルになります。
他ビューへ遷移する前に確認したいビューのVMにIConfirmNavigationRequestインターフェイスを実現し、ConfirmNavigationRequestメソッドを以下のサンプルコードの通り実装することでビューの遷移をキャンセルできます。
以下のサンプルの場合、引数のcontinuationCallbackにbool値を渡すことでビューの遷移がキャンセルできています。
...
namespace ModuleA.ViewModels
{
public class ViewAViewModel : BindableBase, IConfirmNavigationRequest
{
...
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
bool result = true;
if (MessageBox.Show("Do you to navigate?", "Navigate?", MessageBoxButton.YesNo) == MessageBoxResult.No)
result = false;
continuationCallback(result);
}
...
}
}
今回のサンプルでは、continuationCallbackにbool値を渡すことでビュー遷移をキャンセルしていますが、そのアクションにどういった処理が渡されているか分からないため、その部分を読み進めようと思います。
利用箇所を探すとRegionNavigationService. RequestCanNavigateFromOnCurrentlyActiveViewメソッドとRegionNavigationService.RequestCanNavigateFromOnCurrentlyActiveViewModelメソッドで利用されていることが分かりました。
アクティブなビューすべてに問い合わせ終わるまで繰り返し、最終的にはExecuteNavigationメソッドが呼び出されることでビューが遷移する仕組みのようです。もし、キャンセルされた場合は呼び出しがreturnされ、この処理が呼び出されません。
ちなみに呼び出しの入口はDoNavigateメソッドとなっていそうです。
呼び出しを整理すると以下の順になると思われます。
RequestNavigate -> DoNavigate -> RequestCanNavigateFromOnCurrentlyActiveView -> RequestCanNavigateFromOnCurrentlyActiveViewModel -> RequestCanNavigateFromOnCurrentlyActiveView -> RequestCanNavigateFromOnCurrentlyActiveViewModel -> ...
おわりに
今回は、IConfirmNavigationRequest.ConfirmNavigationRequestメソッドを実現し、ビュー遷移をキャンセルするサンプルを見ていきました。
この機能を活用すれば、編集中のビューから別ビューに遷移しようとしたときにユーザーの通知できそうです。
いまいちこれまでのサンプルではすべてのアクティブなビューに問い合わせる処理の意味合いがわからなかったのですが、今回は腹落ちしました。
次回、23-RegionMemberLifetimeについて見ていこうと思います。