Проблемы с отправкой переменной на новую страницу WPF - PullRequest
0 голосов
/ 17 апреля 2020

В следующем классе кнопка получает ExamTemplate от отправителя, создает новый Exam и создает экземпляр страницы CreateExam с правильным объектом Exam:

    public partial class SelectExamTemplate : Page {
        public SelectExamTemplate() {
            InitializeComponent();
            templateItemsControl.ItemsSource = viewModel.templates;
        }

        private SelectExamTemplate_ViewModel viewModel = new SelectExamTemplate_ViewModel();

        private void SelectTemplateButton_Click(object sender, RoutedEventArgs e) {
            ExamTemplate selectedTemplate = (ExamTemplate) ((Button) sender).DataContext;
            Exam newExam = new Exam() { Template = selectedTemplate };
            NavigationService.Navigate(new CreateExam() { Exam = newExam });
        }
    }

Тогда есть страница CreateExam:

    public partial class CreateExam : Page {
        public CreateExam() {
            InitializeComponent();
            this.DataContext = this;
        }

        private void CreateButton_Click(object sender, RoutedEventArgs e) {
            // todo: validate more fully
            if (!(Exam.Name?.Length > 0)) {
                MessageBox.Show("Please enter a name for the exam.");
                return;
            }

            NavigationService.Navigate(new ExamInfo_Home() { Exam = Exam  });
        }

        public Exam Exam { get; set; }
    }

Элемент показывает, что новый был создан, с шаблоном, выбранным в первом классе. Однако следующий класс не работает:

    public partial class ExamInfo_Home : Page {
        public ExamInfo_Home() {
            InitializeComponent();
            this.DataContext = Exam;
            System.Console.WriteLine("Exam:");
            System.Console.WriteLine(Exam);
        }
        public Exam Exam { get; set; }
    }

Установка точки останова в конце конструктора показывает, что Exam равно нулю. (Я также пытался переименовать одно из Exam свойств на случай, если Exam = Exam что-то сбивало с толку, но это не сработало, плюс наведение указателя мыши на каждое из них показало, что компилятор (или кто-либо другой) точно знает, что означает каждое слово относится к (правильно).

Насколько я могу судить, я использую ту же самую точную технику для передачи Exam от выбора к созданию при передаче его от создания к информации.

Почему не работает?

1 Ответ

0 голосов
/ 18 апреля 2020

В вашем классе Create, когда вы вызываете NavigationService.Navigate(new ExamInfo_Home() { Exam = Exam });, вы создаете новый объект ExamInfo_Home, а затем устанавливаете Exam = Exam. В конструкторе Info вы устанавливаете this.DataContext для объекта, который еще не был заполнен.

Вы должны либо передать объект Exam в конструктор следующим образом: new ExamInfo_Home(Exam), либо установить DataContext в другом месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...