diff --git a/20-ConfirmNavigation/ReadMe.md b/20-ConfirmNavigation/ReadMe.md index 7908bd3b..3e1918a8 100644 --- a/20-ConfirmNavigation/ReadMe.md +++ b/20-ConfirmNavigation/ReadMe.md @@ -1,6 +1,7 @@ # Confirm Navigation -TODO +* **ViewAPage** is tab page, and it contains `Switch` and `Button` control, `Switch` is binding to `CanNavigateAway` property. `ViewAPageViewModel ` is implementing `IConfirmNavigation` interface and `CanNavigateAway` is used for returning value in `CanNavigate` method. -- Show use of IConfirmNavigation -- Show use of IConfirmNavigationAsync \ No newline at end of file +* **ViewBPage** is tab page, and it contains `Button`, `Button` and `Command` property is binding to `NavigateAwayCommand`. `ViewBPageViewModel` is implementing `IConfirmNavigationAsync` interface and I am using `IPageDialogService` to ask user for confirm to navigate away, response from `DisplayAlertAsync` is used for return value of `CanNavigateAsync` method. + +* **ViewCPage** is only used for navigating to it, and to show some kind of message with `Label` control. It also has `Button` to navigate back (GoBacAsync). \ No newline at end of file diff --git a/20-ConfirmNavigation/src/PrismSample/App.xaml.cs b/20-ConfirmNavigation/src/PrismSample/App.xaml.cs index 779b33ff..6a04f34b 100644 --- a/20-ConfirmNavigation/src/PrismSample/App.xaml.cs +++ b/20-ConfirmNavigation/src/PrismSample/App.xaml.cs @@ -1,5 +1,4 @@ -using System; -using Prism.Ioc; +using Prism.Ioc; using PrismSample.ViewModels; using PrismSample.Views; using Xamarin.Forms; @@ -16,7 +15,7 @@ protected override async void OnInitialized() { InitializeComponent(); - var result = await NavigationService.NavigateAsync("MainPage"); + var result = await NavigationService.NavigateAsync("TabbedPage?createTab=NonAsyncExamplePage&createTab=AsyncExamplePage"); if(!result.Success) { @@ -27,7 +26,10 @@ protected override async void OnInitialized() protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterForNavigation(); - containerRegistry.RegisterForNavigation(); + containerRegistry.RegisterForNavigation(); + containerRegistry.RegisterForNavigation(); + containerRegistry.RegisterForNavigation(); + containerRegistry.RegisterForNavigation(); } } } diff --git a/20-ConfirmNavigation/src/PrismSample/ViewModels/AsyncExamplePageViewModel.cs b/20-ConfirmNavigation/src/PrismSample/ViewModels/AsyncExamplePageViewModel.cs new file mode 100644 index 00000000..cf75e5da --- /dev/null +++ b/20-ConfirmNavigation/src/PrismSample/ViewModels/AsyncExamplePageViewModel.cs @@ -0,0 +1,34 @@ +using System.Threading.Tasks; +using Prism.Navigation; +using Prism.Commands; +using Prism.Services; + +namespace PrismSample.ViewModels +{ + public class AsyncExamplePageViewModel : IConfirmNavigationAsync + { + private readonly INavigationService _navigationService; + private readonly IPageDialogService _pageDialogService; + + public DelegateCommand NavigateAwayCommand { get; private set; } + + public AsyncExamplePageViewModel(INavigationService navigationService, + IPageDialogService pageDialogService) + { + _navigationService = navigationService; + _pageDialogService = pageDialogService; + + NavigateAwayCommand = new DelegateCommand(NavigateAway); + } + + private async void NavigateAway() + { + await _navigationService.NavigateAsync("ResultPage"); + } + + public Task CanNavigateAsync(INavigationParameters parameters) + { + return _pageDialogService.DisplayAlertAsync(string.Empty, "Are you sure you want to navigate away?", "Yes", "No"); + } + } +} diff --git a/20-ConfirmNavigation/src/PrismSample/ViewModels/MainPageViewModel.cs b/20-ConfirmNavigation/src/PrismSample/ViewModels/MainPageViewModel.cs deleted file mode 100644 index e032cca0..00000000 --- a/20-ConfirmNavigation/src/PrismSample/ViewModels/MainPageViewModel.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Prism.Mvvm; - -namespace PrismSample.ViewModels -{ - public class MainPageViewModel : BindableBase - { - } -} diff --git a/20-ConfirmNavigation/src/PrismSample/ViewModels/NonAsyncExamplePageViewModel.cs b/20-ConfirmNavigation/src/PrismSample/ViewModels/NonAsyncExamplePageViewModel.cs new file mode 100644 index 00000000..e1120207 --- /dev/null +++ b/20-ConfirmNavigation/src/PrismSample/ViewModels/NonAsyncExamplePageViewModel.cs @@ -0,0 +1,37 @@ +using Prism.Navigation; +using Prism.Commands; +using Prism.Mvvm; + +namespace PrismSample.ViewModels +{ + public class NonAsyncExamplePageViewModel : BindableBase, IConfirmNavigation + { + private readonly INavigationService _navigationService; + + private bool _canNavigateAway; + public bool CanNavigateAway + { + get { return _canNavigateAway; } + set { SetProperty(ref _canNavigateAway, value); } + } + + public DelegateCommand NavigateAwayCommand { get; private set; } + + public NonAsyncExamplePageViewModel(INavigationService navigationService) + { + _navigationService = navigationService; + + NavigateAwayCommand = new DelegateCommand(NavigateAway); + } + + private async void NavigateAway() + { + await _navigationService.NavigateAsync("ResultPage"); + } + + public bool CanNavigate(INavigationParameters parameters) + { + return CanNavigateAway; + } + } +} diff --git a/20-ConfirmNavigation/src/PrismSample/ViewModels/ResultPageViewModel.cs b/20-ConfirmNavigation/src/PrismSample/ViewModels/ResultPageViewModel.cs new file mode 100644 index 00000000..3074cd39 --- /dev/null +++ b/20-ConfirmNavigation/src/PrismSample/ViewModels/ResultPageViewModel.cs @@ -0,0 +1,24 @@ +using Prism.Navigation; +using Prism.Commands; + +namespace PrismSample.ViewModels +{ + public class ResultPageViewModel + { + private readonly INavigationService _navigationService; + + public DelegateCommand GoBackCommand { get; private set; } + + public ResultPageViewModel(INavigationService navigationService) + { + _navigationService = navigationService; + + GoBackCommand = new DelegateCommand(GoBack); + } + + private async void GoBack() + { + await _navigationService.GoBackAsync(); + } + } +} diff --git a/20-ConfirmNavigation/src/PrismSample/Views/AsyncExamplePage.xaml b/20-ConfirmNavigation/src/PrismSample/Views/AsyncExamplePage.xaml new file mode 100644 index 00000000..8d51f000 --- /dev/null +++ b/20-ConfirmNavigation/src/PrismSample/Views/AsyncExamplePage.xaml @@ -0,0 +1,17 @@ + + + + +