Navegaciones con nRoute (II)


Sigo revisando la recomendación que me hizo el autor de nRoute de utilizar el atributo MapViewModelViewNavigationAttribute para así sacar partido de implementar la interface ISupportNavigationState en el ViewModel de las vistas

Para ello he implementado la interface ISupportNavigationState en la clase base para la implementación de ViewModel de las vistas, de momento son simplemente un a serie de métodos que será posible sobreescribir en aquellos ViewModels que lo necesiten.

public string Title
{
    get { return this.DisplayName; }
}

public void InitializeState(ParametersDictionary state)
{
    this.OnInitializeState(state);
}

public void RestoreState(ParametersDictionary state)
{
    this.OnRestoreState(state);
}

public ParametersDictionary SaveState()
{
    return this.OnSaveState();
}

protected virtual void OnInitializeState(ParametersDictionary state)
{
}

protected virtual void OnRestoreState(ParametersDictionary state)
{
}

protected virtual ParametersDictionary OnSaveState()
{
    return null;
}

 

Además he modificado el servicio de Navegacion de Chronos para que implemente la interface INavigationHandler de nRoute (lo he planteado así por que no estoy usando, al menos por el momento, los contenedores de navegación que implementa nRoute), de forma que sea posible validar el la petición de navegación realizada a nRoute y procesar la respuesta con el resultado devuelto por nRoute al resolver la nevegación, la forma de procesa la respuesta es casi la misma que la que se utiliza en uno de los contenedores de nRoute, en donde además se comprobará si la respuesta incluye una instancia de ISupportNavigationState que permita inicializar el estado de la vista después de haberla visualizado.

public bool ValidateRequest(NavigationRequest request)
{
    // basic check
    if (request == null)
    {
        throw new ArgumentNullException("request");
    }

    // by default
    return true;
}

public void ProcessResponse(NavigationResponse response)
{
    // basic check
    if (response == null)
    {
        throw new ArgumentNullException("response");
    }

    // we check if the navigation was successfull or not
    if (response.Status != ResponseStatus.Success)
    {
        // we inform the error 
        if (response.Status != ResponseStatus.Cancelled)
        {
            // ShowFailedVisualState(response.Request, response.Status, response.Error);
        }

        return;
    }

    // Show the window
    ServiceLocator.GetService<IWindowManager>().ShowWindow(response.Content as UIElement);

    // we initialize the view, if it supports it
    ISupportNavigationState navigationStateManager = response.NavigationStateManager;
    if (navigationStateManager != null)
    {
        navigationStateManager.InitializeState(response.ResponseParameters);
    }
}

 

y he modificado el método que se encargaba de resolver la navegación, para que utilice el método Navigate en lugar del método Resolve del servicio de navegación de nRoute (nRoute.Navigation.NavigationService)

public void NavigateTo(string target)
{
    Application.Current.Dispatcher.BeginInvoke(
        DispatcherPriority.Normal,
        new ThreadStart(delegate
            {
                nRoute.Navigation.NavigationService.Navigate(
                    new nRoute.Navigation.NavigationRequest(target, nRoute.Navigation.NavigateMode.New),
                    this);
            }));
}


Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s