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

Tra*_*PUK 3 c# vb.net wpf

在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()
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Tig*_*ine 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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
}
Run Code Online (Sandbox Code Playgroud)

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


SLa*_*aks 3

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