从父窗口上下文启动方法?

时间:2018-02-08 16:24:59

标签: c# wpf mvvm

系统以主页面开头,主表和子表可见。然后,当用户单击ReceiveOrder按钮时,将通过执行以下方法的Icommand创建新的WPF窗口

private void ReceiveOrder(object sender)
{
    ReceiveOrderDialogWindow dialog = new ReceiveOrderDialogWindow()
    {
        Topmost = true
    };
    dialog.ShowDialog();

}

ReceiveOrderDialogWindow将其上下文设置为主页的副本。

public ReceiveOrderDialogWindow()
{
    InitializeComponent();
    this.DataContext = new OrdersViewModel("Orders");
    this.SizeToContent = SizeToContent.WidthAndHeight;
}

在ReceiveOrderDialogWindow中。当用户单击确认时,将在OrdersViewModel中触发另一个ICommand。

private void ReceiveOrderConfirm(object sender)                                                                                                  
{
    createReceipt(sender);
    requestSerials(sender);
    Db.UpdateTable(SubVwr.Tables[0].UpdateTableQuery, SubVwr.Tables[0].Tbl);

}

如果我在RecieveOrder中运行createReceipt()它的工作原理很有效,但是当我尝试在ReceiveOrderConfirm()中运行它时,它返回主表为null。我知道这是因为上下文已经变成了OrdersViewModel的一个不同实例,主表不存在。有没有人知道从父窗口的上下文执行方法的方法?

1 个答案:

答案 0 :(得分:2)

  

有没有人知道从父窗口的上下文执行方法的方法?

那么,您首先需要获得对父窗口的引用。更好的方法可能是将ReceiveOrderDialogWindow注入已存在的OrdersViewModel实例并仅对此操作:

<强> ReceiveOrder:

private void ReceiveOrder(object sender)
{
    ReceiveOrderDialogWindow dialog = new ReceiveOrderDialogWindow(this.DataContext as OrdersViewModel)
    {
        Topmost = true
    };
    dialog.ShowDialog();
}

ReceiveOrderDialogWindow:

public ReceiveOrderDialogWindow(OrdersViewModel viewModel)
{
    InitializeComponent();
    this.DataContext = viewModel;
    this.SizeToContent = SizeToContent.WidthAndHeight;
}