首页 > 解决方案 > 无法将变量发送到新的 WPF 页面

问题描述

在下面的类中,按钮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做一些令人困惑的事情,但这没有用,而且将鼠标悬停在每个属性上表明编译器(或任何人)确切地知道每个单词指的是什么(正确)。

据我所知,我使用相同的技术将ExamSelect 传递到 Create,就像我将它从 Create 传递到 Info 一样。

为什么它不起作用?

标签: c#wpf

解决方案


在您的Create班级中,当您调用 时NavigationService.Navigate(new ExamInfo_Home() { Exam = Exam });,您正在创建一个新ExamInfo_Home对象,然后您设置Exam = Exam. 在Info构造函数中,您将 设置为this.DataContext尚未填充的对象。

您应该Exam像这样将对象传递给构造函数:new ExamInfo_Home(Exam)或在DataContext其他地方设置。


推荐阅读