2014-09-03 194 views
0

我正在开发一个Windows Phone应用程序,并且在我的MainPage.xaml.cs文件中,我有一个私有成员正在被改写的方法OnNavigateTo()中被更改。虽然它的值被改变了,但在MainPage构造函数中它的值重置为0(它是一个int成员)。我猜这OnNavigateTo()方法正在构造函数之前调用,但如果是的话,我会有一个nullReferenceException。什么会导致这个问题?NavigateTo()函数在构造函数之前被调用?

的OnNavigateTo()功能:

如果(NavigationContext.QueryString.ContainsKey( “leftDuration”)) {

  //Get the selected value from IntroductionPage as a string 
      var leftRecievedInformation = NavigationContext.QueryString["leftDuration"]; 

      //Convert the string to an enum object 
      var firstRunLeftChosenDuration = (LensLifetime)Enum.Parse(typeof(LensLifetime), leftRecievedInformation); 

      //Set the leftDuration value to the model object    
      _firstRunLeftDuration = getDurationAsNumber(firstRunLeftChosenDuration); 

      MessageBox.Show(_firstRunLeftDuration + ""); 
      model.Left.LifeTime = _firstRunLeftDuration; 

     } 

我的问题构件是_firstRunLeftDuration值。虽然,正如你所看到的,我设置了model.Left.LifeTime的值,在MainPage.xaml中我仍然得到了默认的0值......它就像完全忽略了这一行代码..我知道代码不是特别清楚,但我不知道认为它不会增加额外的无用代码。

这里的MainPage.xaml.cs文件: 公共部分类的MainPage:的PhoneApplicationPage {

public ContactLensesModel model; 
    private int _firstRunLeftDuration, _firstRunRightDuration; //Members used for the initialization of the app 

    public int FirstRunLeftDuration 
    { 
     get 
     { 
      return _firstRunLeftDuration; 
     } 
     set 
     { 
      _firstRunLeftDuration = value; 
     } 
    } 

    public int FirstRunRightDuration 
    { 
     get 
     { 
      return _firstRunRightDuration; 
     } 
     set 
     { 
      _firstRunRightDuration = value; 
     } 

    } 

    public ContactLensesModel Model 
    { 
     get 
     { 
      return model; 
     } 
     set 
     { 
      model = value; 
     } 

    } 

    // Constructor 
    public MainPage() 
    { 

     InitializeComponent(); 

     // Sample code to localize the ApplicationBar 
     BuildLocalizedApplicationBar(); 

     //Should check if the user starts the app for the first time.... 

     //Create a new model 
     Model = new ContactLensesModel(); 
     Model.setLeftNewStartingDate(); 
     Model.setRightNewStartingDate(); 


     //Should load the already saved model if the user in not entering for the first time... 
     //.... 
     //.... 

     loadModel(); 

     //Connect the data Context 
     leftLensDaysRemaining.DataContext = Model.Left; 
     rightLensDaysRemaining.DataContext = Model.Right; 


    } 

    private int getDurationAsNumber(LensLifetime duration) 
    { 

     if (duration.Equals(LensLifetime.Day)) 
      return 1; 
     else if (duration.Equals(LensLifetime.Two_Weeks)) 
      return 14; 
     else 
      return DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     //Get the arguments as strings and convert them to an enum, is true only when the user enters app for the first time. 
     if (NavigationContext.QueryString.ContainsKey("leftDuration")) 
     { 

      //Get the selected value from IntroductionPage as a string 
      var leftRecievedInformation = NavigationContext.QueryString["leftDuration"]; 

      //Convert the string to an enum object 
      var firstRunLeftChosenDuration = (LensLifetime)Enum.Parse(typeof(LensLifetime), leftRecievedInformation); 

      //Set the leftDuration value to the model object   

      FirstRunLeftDuration = getDurationAsNumber(firstRunLeftChosenDuration); 
      Model.Left.LifeTime = FirstRunLeftDuration; 

     } 
     if (NavigationContext.QueryString.ContainsKey("rightDuration")) 
     { 

      //Get the selected value from IntroductionPage as a string 
      var rightRecievedInformation = NavigationContext.QueryString["rightDuration"]; 

      //Convert the string to an enum object 
      var firstRunRightChosenDuration = (LensLifetime)Enum.Parse(typeof(LensLifetime), rightRecievedInformation); 

      //Set the leftDuration value to the model object 
      _firstRunRightDuration = getDurationAsNumber(firstRunRightChosenDuration); 
      Model.Right.LifeTime = _firstRunRightDuration; 
     } 


    } 

    /// <summary> 
    /// Loads the model from the isolated Storage 
    /// </summary> 
    private void loadModel() 
    { 
     //Load the model... 
    } 


    private void BuildLocalizedApplicationBar() 
    { 
     // Set the page's ApplicationBar to a new instance of ApplicationBar. 
     ApplicationBar = new ApplicationBar(); 

     // Create a new button and set the text value to the localized string from AppResources. 
     ApplicationBarIconButton appBarSettingsButton = new ApplicationBarIconButton(new Uri("/Assets/Icons/settingsIcon4.png", UriKind.Relative)); 
     appBarSettingsButton.Text = AppResources.AppBarSettingsButtonText; 
     appBarSettingsButton.Click += appBarButton_Click; 
     ApplicationBar.Buttons.Add(appBarSettingsButton); 

     // Create a new menu item with the localized string from AppResources. 
     //ApplicationBarMenuItem appBarMenuItem = new ApplicationBarMenuItem(AppResources.AppBarMenuItemText); 
     //ApplicationBar.MenuItems.Add(appBarMenuItem); 
    } 

    void appBarButton_Click(object sender, EventArgs e) 
    { 
     NavigationService.Navigate(new Uri("/SettingsPage.xaml", UriKind.RelativeOrAbsolute)); 
    } 

    private void leftButtonChange_Click(object sender, RoutedEventArgs e) 
    { 
     model.setLeftNewStartingDate(); 
    } 

    private void rightChangeButton_Click(object sender, RoutedEventArgs e) 
    { 
     model.setRightNewStartingDate(); 
    } 
} 

}

+1

看到构造函数和'OnNavigateTo'方法会非常有益。 – 2014-09-03 20:39:14

回答

0

OnNavigatedTo方法不能构造函数之前被调用。构造函数总是先执行。我认为你的model.Left.LifeTime不会引发PropertyChanged事件。因此,你的View不会知道你给它一个价值。因此,它将显示默认值model.Left.Lifetime,它可能为0.

另一方面,如果没有看到代码的其余部分,很难分辨出来。

+0

非常感谢您的回答!什么可能导致这个问题? – 2014-09-04 17:02:41

相关问题