2014-09-03 123 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

相關問題