【问题标题】:WPF - initialize object with wizard in second WindowWPF - 在第二个窗口中使用向导初始化对象
【发布时间】:2018-07-09 08:07:46
【问题描述】:

我在 WPF 应用程序中努力在类似向导的窗口的帮助下初始化对象。我有一个主应用程序窗口,用于显示Plan 对象的内容。我想在另一个窗口中初始化 Plan 对象,这类似于帮助用户参数化 Plan 的向导。

概念如下:

MainWindow.xaml.cs

public partial class MainWindow : RibbonWindow
{
    public Plan apActivePlan;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void rbNewPlan_Click(object sender, RoutedEventArgs e)
    {
        WndAddEditPlan wndAddPlan = new WndAddEditPlan(ref apActivePlan);
        wndAddPlan.ShowDialog();

        if (wndAddPlan.DialogResult.HasValue && wndAddPlan.DialogResult.Value)
        {
            /* "Create" button clicked in wndAddPlan,
             * so we update the ListView in MainWindow */
            lvPlanRows.ItemsSource = this.apActivePlan.Rows; // this is where the problem occurs - apActivePlan is null despite the fact that it has been initialized by wndAddPlan
        }
    }

WndAddEditPlan.xaml.cs

public partial class WndAddEditPlan : Window
{
    Plan apActivePlan = null;

    public WndAddEditPlan(ref Plan apActivePlan)
    {
        InitializeComponent();

        this.apActivePlan = apActivePlan;
        if(this.apActivePlan == null)
            this.apActivePlan = new Plan();
    }
    private void btnCreatePlan_Click(object sender, RoutedEventArgs e)
    {
        DialogResult = true;
    }
}

用户点击NewPlan按钮,会弹出创建新Plan的向导。用户填写所需信息并单击CreatePlan 按钮。向导关闭,但 MainWindow 中的 apActivePlan 未初始化。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    您不必将 ref 与引用类型对象一起传递,因为它们 已经引用Check this

    另一件事

    this.apActivePlan = new Plan();
    

    这里你将内存分配给一个局部变量。

    Plan apActivePlan = null;
    

    不是你传入的那个

    ref Plan apActivePlan
    

    两者都是不同的内存指针。

    所以你是分配内存到 WndAddEditPlan 的本地引用并期望 MainWindow 的变量被初始化。

    所以改变这一行

    apActivePlan = new Plan();
    

    而不是

    this.apActivePlan = new Plan();
    

    【讨论】:

    • 我删除了ref关键字并将行调整为apActivePlan = new Plan();,但在返回MainWindow后,MainWindow中的apActivePlan成员仍然是null
    • 如果我在 WndAddEditPlan 中定义了一个构造函数而不是 WndAddEditPlan wndAddPlan = new WndAddEditPlan(ref apActivePlan);,以接收对 MainWindow 的引用,而不是仅开始工作的 apActivePlan 字段。可能是DataContext 搞砸了?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2018-06-26
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多