Pregunta

Estoy desarrollando una aplicación de navegación beta de Silverlight 3, así que me he ido con una ligera variación del patrón MVVM :) (modelo de vista todo en uno), usando prisma y otras cosas.

Pregunta: ¿Cómo navego a una " NavigationPage " diferente en el modelo de vista

Ahora, para abreviar una larga historia, el modelo de vista se declara como un recurso de página.

<navigation:Page.Resources>
    <mvvm:LoginModel x:Key="DataSource" d:IsDataSource="True"></mvvm:LoginModel>
</navigation:Page.Resources>

Y luego se usa un comando para conectar todo con el modelo de vista

<Button x:Name="LoginButton" Width="100"  Margin="8" Content="Login"
        prism:Click.Command="{Binding LoginCommand}"/>

Ahora si trato de navegar a cualquier lugar en el modelo de vista así

this.NavigationService.Navigate(new Uri("/Views/About.xaml", UriKind.Relative));

el servicio de navegación es nulo, busqué y encontré este artículo, que describe el uso de la hélice 0.3 para la navegación, se construyó en los días sl2, cuando los controles de navegación nunca existieron, ahora el modelo de la hélice funciona bien, e implementando INavigationAware en el viewmodel, puede obtener acceso al NavigationContext y luego hacer lo que sea necesario, he intentado helix y funciona.

SL3 viene con el soporte de navegación incorporado, por así decirlo, que hace exactamente lo que hace Helix. Por lo tanto, no quiero usar un marco de terceros, sino que prefiero usar las funciones integradas de sl3.

¿Hay algo en SL3 que emule la interfaz INavigationAware de la hélice?

¿Fue útil?

Solución

Personalmente creo que NavigationService es un concepto de interfaz de usuario asociado con el marco o la página de la interfaz de usuario.

Otra forma de lograr esto sin tener que pasar un NavigationService al modelo de vista es hacer que ViewModel genere un evento cuando se supone que se produce la navegación ... haga que la vista maneje el evento del modelo de vista y llame a Navigate en respuesta.

Otros consejos

Una solución poco fiable, pero lo único que he podido usar para que esto funcione. En el evento OnNavigatedTo en la vista, acceda al ViewModel y configure el NavigationService en una propiedad en el modelo de vista para que pueda usarse más adelante en el modelo de vista

    protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            ViewModels.LoginViewModel viewmodel = (ViewModels.LoginViewModel)this.Resources["DataSource"];
//DataSource being the x:Name given to the viewmodel that is loaded as a page resource
            viewmodel .service = NavigationService;
        }

Es posible que desee considerar el uso del sistema de mensajería si está utilizando MVVM light. Haga que un oyente en su página aloje el marco que realiza la navegación y envíe los mensajes de navegación desde sus modelos de vista.

está bien para ayudarme con mi pregunta, porque todavía no ha habido ninguna respuesta, voy a arrojarle más información.

Este es el código en el modelo de vista

public LoginModel()
    {
        LoginCommand = new DelegateCommand<object>(LoginCommandExecuted, a => { return _CanLoginCommandExecute; });
    }

    public ICommand LoginCommand { get; private set; }
    private bool _CanLoginCommandExecute = true;
    private void LoginCommandExecuted(object parameter)

    {
        _CanLoginCommandExecute = false;

        AdminClient client = new AdminClient();
        client.AuthorizeAsync();
        client.AuthorizeCompleted += 
        new EventHandler<AsyncCompletedEventArgs>(
                (s, e) =>
                {
                    if (e.Error != null)
                    {
                        MessageBox.Show("Login Failed");
                    }
                    else
                    {
                        this.NavigationService.Navigate(new Uri("/Views/About.xaml", UriKind.Relative));
                    }
                    _CanLoginCommandExecute = true;
                }
                );

    }

NavigationService es nulo, por lo tanto, no puedo pasar a la siguiente vista, ¡ayuda!

NavigationService.Navigate(new Uri("/About", UriKind.Relative));

Lo anterior debería funcionar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top