Windows phone 7 NavigationService引发NullReferenceException

Windows phone 7 NavigationService引发NullReferenceException,windows-phone-7,mvvm,navigation,mvvm-light,Windows Phone 7,Mvvm,Navigation,Mvvm Light,使用MVVMLight,我正在尝试开发一个相当简单的WP7应用程序。我在使用导航服务时遇到问题。我可以导航到一个页面,但按下后退按钮后,我无法再次导航到同一页面。NavigationService引发NullReferenceException 我已经使用GalaSoft.MvvmLight.Messaging命名空间中的消息实现了导航。所有我的视图都继承自自定义PhoneApplicationPage基类,该基类在NavigationRequest上注册侦听器: public class Ph

使用MVVMLight,我正在尝试开发一个相当简单的WP7应用程序。我在使用导航服务时遇到问题。我可以导航到一个页面,但按下后退按钮后,我无法再次导航到同一页面。NavigationService引发NullReferenceException

我已经使用GalaSoft.MvvmLight.Messaging命名空间中的消息实现了导航。所有我的视图都继承自自定义PhoneApplicationPage基类,该基类在NavigationRequest上注册侦听器:

public class PhoneApplicationPage : Microsoft.Phone.Controls.PhoneApplicationPage
{
    public PhoneApplicationPage() : base()
    {
        Messenger.Default.Register<Uri>(this, "NavigationRequest", (uri) => NavigationService.Navigate(uri));
    }
}
就像我说的,除了在按下后退按钮后导航时,这项功能是有效的。 这是为什么?我如何解决


有没有更好的方法使用MVVM Light实现导航?

我也在使用MVVM Light。我有一个名为PageConductor的类,它基于来自Microsoft的John Papa Silverlight MVP使用的内容。这是我使用的PageConductor服务

public class PageConductor : IPageConductor
{
    protected Frame RootFrame { get; set; }

    public PageConductor()
    {
        Messenger.Default.Register<Messages.FrameMessage>(this, OnReceiveFrameMessage);
    }
    public void DisplayError(string origin, Exception e, string details)
    {
        string description = string.Format("Error occured in {0}. {1} {2}", origin, details, e.Message);
        var error = new Model.Error() { Description = description, Title = "Error Occurred" };
        Messenger.Default.Send(new Messages.ErrorMessage() { Error = error });
    }

    public void DisplayError(string origin, Exception e)
    {
        DisplayError(origin, e, string.Empty);
    }
    private void OnReceiveFrameMessage(Messages.FrameMessage msg)
    {
        RootFrame = msg.RootFrame;
    }
    private void Go(string path, string sender)
    {
        RootFrame.Navigate(new Uri(path, UriKind.Relative));
    }
    public void GoBack()
    {
        RootFrame.GoBack();
    }
}
然后,我使用依赖注入将PageConductor服务的一个实例实例化到MainPage ViewModel中。这是我的MainViewModel类:

protected Services.IPageConductor PageConductor { get; set; }
    public RelayCommand<string> NavigateCommand { get; set; }

    public MainViewModel(Services.IPageConductor pageConductor)
    {

        PageConductor = pageConductor;
        RegisterCommands();
    }
    private void RegisterCommands()
    {
        NavigateCommand = new RelayCommand<string>(
            (source) => OnNavigate(source));

    }
    private void OnNavigate(string sender)
    {
        PageConductor.GoToView(sender, "main");
    }
为了进一步参考,my Messages.FrameMessage类仅为:

internal class FrameMessage
{
    public Frame RootFrame { get; set; }
}

前进/后退按钮没有问题。

我也在使用MVVM灯。我有一个名为PageConductor的类,它基于来自Microsoft的John Papa Silverlight MVP使用的内容。这是我使用的PageConductor服务

public class PageConductor : IPageConductor
{
    protected Frame RootFrame { get; set; }

    public PageConductor()
    {
        Messenger.Default.Register<Messages.FrameMessage>(this, OnReceiveFrameMessage);
    }
    public void DisplayError(string origin, Exception e, string details)
    {
        string description = string.Format("Error occured in {0}. {1} {2}", origin, details, e.Message);
        var error = new Model.Error() { Description = description, Title = "Error Occurred" };
        Messenger.Default.Send(new Messages.ErrorMessage() { Error = error });
    }

    public void DisplayError(string origin, Exception e)
    {
        DisplayError(origin, e, string.Empty);
    }
    private void OnReceiveFrameMessage(Messages.FrameMessage msg)
    {
        RootFrame = msg.RootFrame;
    }
    private void Go(string path, string sender)
    {
        RootFrame.Navigate(new Uri(path, UriKind.Relative));
    }
    public void GoBack()
    {
        RootFrame.GoBack();
    }
}
然后,我使用依赖注入将PageConductor服务的一个实例实例化到MainPage ViewModel中。这是我的MainViewModel类:

protected Services.IPageConductor PageConductor { get; set; }
    public RelayCommand<string> NavigateCommand { get; set; }

    public MainViewModel(Services.IPageConductor pageConductor)
    {

        PageConductor = pageConductor;
        RegisterCommands();
    }
    private void RegisterCommands()
    {
        NavigateCommand = new RelayCommand<string>(
            (source) => OnNavigate(source));

    }
    private void OnNavigate(string sender)
    {
        PageConductor.GoToView(sender, "main");
    }
为了进一步参考,my Messages.FrameMessage类仅为:

internal class FrameMessage
{
    public Frame RootFrame { get; set; }
}

“前进/后退”按钮没有问题。

非常感谢。过了一段时间,我让你的例子起作用了。我现在可以导航了:-非常感谢Scott!非常感谢你。过了一段时间,我让你的例子起作用了。我现在可以导航了:-非常感谢Scott!