简体   繁体   English

NavigateTo()函数在构造函数之前被调用?

[英]NavigateTo() Function is being called before constructor?

I am developing a Windows phone App and in my MainPage.xaml.cs file I have one private member that is being changed in the overrided method OnNavigateTo() . 我正在开发Windows Phone应用程序,并且在MainPage.xaml.cs文件中有一个私有成员,该成员将在重写方法OnNavigateTo()进行更改。 Although its value is changed, after that in the MainPage constructor its value resets to 0 (It's an int member). 尽管其值已更改,但之后在MainPage构造函数中,其值重置为0(它是一个int成员)。 I guess that OnNavigateTo() method is being called BEFORE the constructor but if so I would have a nullReferenceException. 我猜OnNavigateTo()方法在构造函数之前被调用,但是如果这样的话,我将有一个nullReferenceException。 What can cause that problem? 什么会导致该问题?

The OnNavigateTo() Function: OnNavigateTo()函数:

if (NavigationContext.QueryString.ContainsKey("leftDuration")) { 如果(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;

        }

My problematic member is the _firstRunLeftDuration value. 我有问题的成员是_firstRunLeftDuration值。 Although, as you can see, i set the model.Left.LifeTime value, in the MainPage.xaml I still get the default 0 value... It' like completely ignoring this line of code.. I know the code is not particularly clear but I don't think its beneficial to add extra lines of useless code. 虽然,如您所见,我设置了model.Left.LifeTime值,但在MainPage.xaml中,我仍然获得了默认的0值……这就像完全忽略了这一行代码。。我知道代码并不是特别清楚,但我认为添加多余的无用代码行没有好处。

Here's the MainPage.xaml.cs file: public partial class MainPage : PhoneApplicationPage { 这是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();
    }
}

} }

The OnNavigatedTo method cannot be called before the constructor. 不能在构造函数之前调用OnNavigatedTo方法。 The constructor is always executed first. 构造函数始终首先执行。 I think your model.Left.LifeTime doesn't raise a PropertyChanged event. 我认为您的model.Left.LifeTime不会引发PropertyChanged事件。 Hence, your View won't know you are giving it a value. 因此,您的View不会知道您是否为其提供了价值。 Therefore it will show the default value of model.Left.Lifetime which is probably 0. 因此,它将显示model.Left.Lifetime的默认值,该值可能为0。

On the other hand, it's hard to tell without seeing the rest of your code. 另一方面,不看代码其余部分就很难分辨。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM