Template10 icon indicating copy to clipboard operation
Template10 copied to clipboard

Reconsider if ViewModelBase should implement NavigationService

Open JerryNixon opened this issue 4 years ago • 1 comments

It's already possible to retrieve the NavigationService in a Template 10 view-model using the GetNavigationService() extension method off the NavigationParameters passed into the OnNavigatedTo and OnNavigatedToAsync methods. You can also use GetSynchronizationContext() to help with threading. These are not discoverable, I know, but they are easy.

Here's the syntax:

public class MyViewModel : ViewModelBase
{
    private INavigationService _nav;

    public override void OnNavigatedTo(INavigationParameters parameters)
    {
        _nav = parameters.GetNavigationService();
    }
}

The issue here, however, is the change in heart I have had with NavigationService. I believe that an app should create its own NavigationService, lately I have been calling mine NavigationManager in order to disambiguate the name. The reason to remove it from ViewModelBase as a public property is that it encourages a generic use case instead of an app-specific one. It also shows up when using binding and that's really confusing.

Here's what I am recommending:

public class NavigationManager
{
    private readonly NavigationService _navigationService;

    public NavigationManager(NavigationService navigationService)
    {
        _navigationService = navigationService;
    }
}

public class MyViewModel : ViewModelBase
{
    private readonly NavigationManager _nav;

    public MyViewModel(NavigationManager navigationManager)
    {
        _nav = navigationManager;
    }
}

This is not a recommendation to remove the extension methods or the ability to access the NavigationService. Just removing the public property on the view-model in order to encourage better patterns. If you don't want better patterns, then the extension methods are still there. You can also sub-class ViewModelBase in order to restore the property, too.

JerryNixon avatar Dec 17 '19 23:12 JerryNixon

I think this is the right way to proceed, that way people can always implement their own services if they wish to without worrying for services they don't need.

panoukos41 avatar Dec 18 '19 23:12 panoukos41