C# 将详细信息从一个窗口传递到另一个窗口

C# 将详细信息从一个窗口传递到另一个窗口,c#,wpf,datagrid,selectionchanged,C#,Wpf,Datagrid,Selectionchanged,我选择了一些文本框,当用户希望注意到他们与其他人有过联系时,他们会填写这些文本框。大多数文本框都是通过键入来填充的。但是,对于其中一个,我希望用户能够从单击按钮时出现的人员列表中进行选择 这就是我遇到问题的地方。到目前为止,我刚刚创建了一个DataGrid,并处理了它的SelectionChanged方法来填充textboxstext属性。这很好,但是现在在当前页面上没有足够的空间来显示整个DataGrid,其中包含他们可以选择的所有人员 我决定在一个单独的、较小的窗口中显示人员,当用户单击按钮

我选择了一些
文本框
,当用户希望注意到他们与其他人有过联系时,他们会填写这些文本框。大多数
文本框
都是通过键入来填充的。但是,对于其中一个,我希望用户能够从单击按钮时出现的
人员列表中进行选择

这就是我遇到问题的地方。到目前为止,我刚刚创建了一个
DataGrid
,并处理了它的
SelectionChanged
方法来填充
textboxs
text属性。这很好,但是现在在当前页面上没有足够的空间来显示整个
DataGrid
,其中包含他们可以选择的所有人员

我决定在一个单独的、较小的
窗口中显示
人员
,当用户单击
按钮时,该窗口会出现。我遇到的问题是,当用户选择他们希望在新的
窗口中标记联系人的
人员
时,我不知道如何通知原始
窗口
已选择了
人员
,关闭新的较小的
窗口
,并在原始
窗口
上填写相应的
文本框


根据打开的
窗口
上的选择,填写原始
窗口
上的
文本框
最直观的方法是什么?

我将使用委托,委托调用原始窗口的函数并用它解析更改的变量。所以你知道当用户点击某个东西时,你可以直接对这个“事件”做出反应

链接:

如果您使用像Galasoft的MVVM Light()这样的框架,他们就有一个messenger系统用于此目的。它允许您“广播”可由应用程序的任何其他部分“接收”的消息

这是在考虑使用域、模型、表示(MVC格式的Winforms/WPF版本)来执行应用程序时使用的

您可以将每个表单作为自己的类,它们是自己的类。创建每个表单类,但如果控件是私有的,则向其中添加一些公共成员。让它们只具有“get”属性,并返回该形式的任何控件或变量的值。您的主窗体将是控制窗体。所有表单都将由主表单处理,因此当您打开它时,它是主表单可以访问的类

现在,如果我记得(最近做了更多的MVC而不是任何Winforms),我相信如果使用ShowDialog()方法,它将冻结主线程,这样当您关闭主窗体时,您可以继续阅读您打开的forms类中的公共成员。我相信它的运行方式是一样的。如果使用just Show(),线程将继续异步运行。使用异步,您可能需要在启动代码中使用一个主窗体,以便始终有一个窗口,但订阅窗体的关闭事件,并有一个方法可以将这些公共成员抓取出来。确保在主类的根目录实例化额外的表单,这样当它存在于调用它的方法时,它就不会超出范围。您甚至可以使调用的方法成为异步调用,并且在窗体上运行Show方法的命令之前有一个wait

总之,将每个窗体视为自己的类,但添加可以从所需控件和/或变量读取值的公共成员。当类通过事件关闭时,或者当线程从窗体关闭中关闭时,从类中读取该数据。表单关闭并没有丢弃对象,只是表单的可视化

哦,如果您正在将信息从主窗体传递给要打开的子窗体,则可以为该窗体类添加一个构造函数,该构造函数将您的输入作为模型或值,以在显示之前填充适当的变量或窗体,或者创建一个公共属性,您可以在显示该类之前输入要发送的值

记住,每件事都是一个类,一旦你以这样的方式看待它,并以这样的方式对待它,答案就会出现。:-)

我应该警告你,我是一个长篇大论的解释者


在工作中,将所有这些从内存中记录下来,以便可能存在一些错误。如果有,请告诉我。

我想问题是访问主窗口的控件,不是吗? 您可以使用以下结构定义更改用户选择和访问主窗口控件的事件:

((MainWindow)Application.Current.MainWindow).MyTextBox