Нулевая ссылка при передаче параметра со страницами навигации [WP8.1]

#c# #xaml #navigation #nullreferenceexception #windows-phone-8.1

#c# #xaml #навигация #Исключение nullreferenceexception #windows-phone-8.1

Вопрос:

Я не понимаю, почему или что я делаю неправильно, но я получаю исключение с нулевой ссылкой, когда следующий код выполняется в моем приложении Windows Phone 8.1:

Сначала приложение выполняет навигацию и передает выбранную станцию на следующую страницу…

Код с главной страницы:

     // When an item is selected, go to the next page and pass info
    private void listBoxStations_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        // Get the selected station item
        CompleteStation selectedStation = (CompleteStation)this.listBoxStations.SelectedItem;

        this.Frame.Navigate(typeof(StationInformationPage), selectedStation);


        // Make sure we set the selected index to -1 after item is selected so
        // when we come back to page, no items are selected
        this.listBoxStations.SelectedIndex = -1;
    }
  

Вот код, который выдает ошибку null на следующей странице:

     private CompleteStation station;

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        this.navigationHelper.OnNavigatedTo(e);
        this.station = (CompleteStation)e.Parameter;
        AddInformation();
    }

    private void AddInformation()
    {
        this.txtStationTitle.Text = station.StationName;
        // Add more information here
    }
  

Ошибка, в частности, возникает, когда я пытаюсь изменить txtStationTile .Текст на станцию.StationName .

Если я удалю код, который изменяет текстовое поле, и пройдусь по программе, это покажет, что переменная station на самом деле не равна нулю к концу метода OnNavigatedTo …

Любая помощь будет с благодарностью!

-Йохан

Ответ №1:

Кажется, что это не станция, которая имеет значение null, а this.txtStationTitle .

Вы делаете все, OnNavigatedTo пока страница (XAML), включая текстовый блок, который вы пытаетесь изменить, загружена не полностью, поэтому текстовый блок имеет значение null, и когда вы пытаетесь это сделать this.txtStationTitle.Text , вы получаете исключение NullReferenceException .

Однако, если вы вызовете AddInformation Loaded обработчик событий страницы, вы будете уверены, что страница полностью загружена, и текстовый блок больше не будет иметь значения null.

 public SomePage()
{
    this.InitializeComponent();
    this.Loaded  = SomePage_Loaded;
}

void SomePage_Loaded(object sender, RoutedEventArgs e)
{
    AddInformation();
}
  

Этот тип исключений обычно очень легко отлаживается. Установка точки останова в следующей строке:

 this.txtStationTitle.Text = station.StationName;
  

и изучение this.txtStationTitle и station сделало бы очень простым выяснить, что именно равно нулю.