My MasterPage consists of a single ListView that is grouped. When I select an item on the list, I have to update the MasterDetail.
NavigationPage detail;
// bla bla if statements and crap
// bla bla
detail = new NavigationPage(_someFooPageFactory.Init());
App.Navigation = detail.Navigation; // this is my global static used for navigation throughout the app
((MasterDetailPage)Parent).Detail = detail;
So I'm wondering... is there a better way of swapping this out?
I tried to set CurrentPage
of the Navigation, but it has no setter. It feels strange to create a new NavigationPage and update my global static every time. I figured it should be possible to update only the page contained within the NavigationPage, and never have to touch the Detail page.
Here's my complete method.
private async void TriggerNavitation(NavigationItem selectedItem)
{
if (_currentSelectedItem != null && selectedItem.Item.GetHashCode() == _currentSelectedItem.GetHashCode())
{
// don't load anything if you're returning to the same page
_onToggleRequest(false);
return;
}
_currentSelectedItem = selectedItem.Item;
// if a segment (or multiple segments) are showing, we need to remove them in order to return to the top page
if (IsSegmentShowing)
{
await App.Navigation.PopToRootAsync();
}
NavigationPage detail;
// show a module or section if the selected item is of the proper type
var moduleTabViewModel = selectedItem.Item as ModuleTabViewModel;
if (moduleTabViewModel != null)
{
_settingsService.AddOrUpdateValue("ModuleId", moduleTabViewModel.Id.ToString());
_settingsService.Save();
if (moduleTabViewModel.Segments.Count == 1)
{
// jump straight to the segment because there's only one
detail = new NavigationPage(_segmentPageFactory.Init(moduleTabViewModel.Segments[0].Id,
moduleTabViewModel.Id,
moduleTabViewModel.Title,
_segmentPageFactory,
_onToggleRequest, true));
}
else
{
// we don't want reference crap being passed... we're building it asynchronously
// if we leave the segments in, the view takes longer to build
moduleTabViewModel.Segments.Clear();
detail = new NavigationPage(_modulePageFactory.Init(_onToggleRequest, moduleTabViewModel));
}
}
else if (selectedItem.Item as UserViewModel != null)
{
// user is going to their profile page
detail = new NavigationPage(_editProfilePageFactory.Init(_afterDeauthenticated));
}
else
{
// user is looking at one of the static text pages.
detail = new NavigationPage(_basicContentPageFactory.Init((BasicContentPage.SettingsAndMoreType)selectedItem.Item, selectedItem.Title));
}
App.Navigation = detail.Navigation;
((MasterDetailPage)Parent).Detail = detail;
_onToggleRequest(false);
}