C# 如何实现从子窗口到父窗口的更改

C# 如何实现从子窗口到父窗口的更改,c#,wpf,parent-child,C#,Wpf,Parent Child,这可能是一个相当简单的问题,但到目前为止,我还没有幸对此进行研究。我有一个儿童窗口,上面有“是”和“否”按钮。单击“否”时,我希望父窗口(我的程序的主窗口)中的复选框处于未选中状态 还有什么我可以做的吗 //No Button private void No_Click(object sender, RoutedEventArgs e) { NameOfParent.checkBox.Checked = false; } 我见过这个问题,但并不认为它完全解决了我的问题 正确的方法是什么

这可能是一个相当简单的问题,但到目前为止,我还没有幸对此进行研究。我有一个儿童窗口,上面有“是”和“否”按钮。单击“否”时,我希望父窗口(我的程序的主窗口)中的复选框处于未选中状态

还有什么我可以做的吗

//No Button
private void No_Click(object sender, RoutedEventArgs e)
{
    NameOfParent.checkBox.Checked = false;
}
我见过这个问题,但并不认为它完全解决了我的问题

正确的方法是什么

我一直在用这个打开我的其他窗口:

父窗口-当前代码:

//Open new window
private void checkBox5_Checked(object sender, RoutedEventArgs e)
{
       var newWindow = new ChildWindow();
       newWindow.button_no.Click += buttonNo_click;
       newWindow.Show();
}

//Unchecks Checkbox 5
private void buttonNo_click(object sender, RoutedEventArgs e)
{
    checkBox5.IsChecked = false;
}

从父窗口打开子窗口:

private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        var window = new ChildWindow();
        window.buttonNo.Click += buttonNo_Click;
        window.Show();
    }
public void ButtonClickHandler(....)
{
    m_parentWindow.checkBox1.Enabled = true;
    m_parentWindow.checkBox1.Checked = true;
}
在父窗口的代码中,为子窗口的“否”按钮包含此单击事件:

    private void buttonNo_Click(object sender, RoutedEventArgs e)
    {
        //code to uncheck the checkbox goes here
    }

事实证明,这比我一直使用的Windows窗体解决方案更简单……而且它似乎也适用于Windows窗体。

关于子窗口的构造,只需添加父窗口类型的参数即可。 然后,在父窗口代码中构造子窗口时,请执行以下操作(在父窗口类中):

关键字this将把父窗口传递到子窗口

然后可以将其存储到类变量中并访问其属性

子类构造函数和parentWindow变量:

private ParentWindowType m_parentWindow = new ParentWindowType();
public ChildWindow(ParentWindowType parent, int other_param, string other_param2....)
{
    m_parentWindow = parent;
}
然后,在其他子类方法中,例如按钮单击处理程序,您可以从父窗口访问属性:

private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        var window = new ChildWindow();
        window.buttonNo.Click += buttonNo_Click;
        window.Show();
    }
public void ButtonClickHandler(....)
{
    m_parentWindow.checkBox1.Enabled = true;
    m_parentWindow.checkBox1.Checked = true;
}
这样,您可以将父窗口存储在子窗口中,并且始终可以访问它。 这样做既干净又简单。确保在子窗口类中将父窗口变量设为私有

如果公开,你可以做一些有趣的事情,比如

parentWindow.childWindow.m_parentWindow.childWindow etc......

是的,有一种方法,但你不想这样做。创建一个合适的ViewModel,并通过数据绑定(这是正确的方法)执行此操作。或者使用消息框架并将所有必要的部分订阅到正确的消息。form2应该是我的子窗口吗?我只是不知道该在表格上写些什么。顺便说一下,这是WPF,不是Win表单。啊,我还不熟悉WPF,所以我不确定它们有多不同。在Windows窗体中,我通过编写
ChildForm Form2=new ChildForm()打开子窗体Form2.ButtonClickAction+=form_ButtonClickAction
,它调用包含代码的void,当子窗体中的按钮单击事件触发
公共事件操作按钮ClickAction
时,我希望发生什么。好吧,我创建了自己的小WPF程序并解决了它。编辑我的答案以与WPF相关。如果它显示ChildWindow,您需要为此包含任何内容吗?我一直在使用var打开我的窗口。我将发布我的代码。我不认为使用var会有任何区别,它的关键部分是下一行,它只是告诉父窗体在单击子窗体上的buttonNo时运行buttonNo\u Click方法。