如何将数据从打开的窗口发送回WPF中的opener

时间:2010-04-25 15:58:11

标签: c# wpf vb.net

在WPF中,我有一个窗口打开第二个窗口,允许进行一些数据选择。选择完成后,我想提交/关闭第二个/子窗口,并将数据推回到开始/父窗口。

我可以通过公共属性将数据从父级推送到子窗口,但还没有找到如何以其他方式将其恢复。有人可以帮忙吗?

我用来打开窗口并设置一些属性的代码如下:

Dim wdwContacts As New appContacts()
wdwContacts.selClientID = selClientID
wdwContacts.selEmailToCCType = selEmailToCCType
wdwContacts.pullToAddresses = txEmailTo.Text
wdwContacts.pullCCAddresses = txEmailCC.Text
wdwContacts.Owner = Me
wdwContacts.WindowStartupLocation = Windows.WindowStartupLocation.CenterOwner
wdwContacts.Show()

基础是我将第一个窗口作为电子邮件撰写页面,其中包含一个按钮,单击该按钮会显示电子邮件联系人列表。它从第一个窗口中引入任何先前选择的电子邮件地址,并在子窗口/电子邮件列表中自动选择它们。如果在电子邮件列表上进行了进一步选择,当操作单击完成/提交/关闭按钮时,它会将新选择列表推回到第一个/父窗口上的相关TextBox中。

由于

2 个答案:

答案 0 :(得分:6)

我建议你在appContacts中定义一个事件,然后你可以从你的调用类中订阅它。 然后,事件将从您的对话框中获得EventArgs的结果。

这可以节省您在通话类中检查“通过OK而不是取消”的检查。

在Code中,这看起来像这样:首先创建EventArgs类,它将封装窗口中的返回数据:

public class WindowEventArgs : EventArgs
{
    private readonly string username;
    private readonly string password;
    public string Username { get; private set; }
    public string Password { get; private set; }

    public WindowEventArgs(string username, string password)
    {
        this.username = username;
        this.password = password;
    }
}

然后在SubWindow上定义一个事件,并创建一个方法来调用该事件,如果有事件订阅者(如果有任何构造EventArgs类并将其传递给事件):

public class SubWindow
{
    public event EventHandler<WindowEventArgs> DialogFinished;

    public void OnDialogFinished()
    {
        if (DialogFinished != null)
            DialogFinished(this, new WindowEventArgs("some username", "some password"));
    }
}

在您的父窗口中,您现在可以在打开窗口时简单地连接到事件处理程序:

public void OpenSubWindow()
{
    var subWindow = new SubWindow();
    subWindow.DialogFinished += new EventHandler<WindowEventArgs>(subWindow_DialogFinished);
}

void subWindow_DialogFinished(object sender, WindowEventArgs e)
{
    //Do Something with the results you get from e.Username & e.Password
}

我显然在纯C#类中做到了这一点,所以在现实世界的WPF应用程序中,Subwindow会成为Frame的一个孩子,但我希望它能说明我想要做的事情。 现在,当您想要传回数据并关闭窗口时,您只需调用子窗口中的OnDialogFinished方法。

答案 1 :(得分:2)

您可以在appContacts类中设置属性,然后处理窗口的Close事件并在opener窗口中读取这些属性。