【发布时间】:2019-07-22 16:44:57
【问题描述】:
在我的程序中,我有两个窗口,第一个是带有文本框的主窗口,第二个是带有用于更新第一个窗口中的文本框的按钮的输入字段。一般来说,我是使用 WPF 和 C# 编码的初学者,但是有没有办法将我的主窗口的指针或引用传递给第二个窗口,以便第二个窗口可以编辑我的第一个窗口的文本框?这甚至是解决这个问题的正确方法吗?
【问题讨论】:
标签: c# wpf windows pointers reference
在我的程序中,我有两个窗口,第一个是带有文本框的主窗口,第二个是带有用于更新第一个窗口中的文本框的按钮的输入字段。一般来说,我是使用 WPF 和 C# 编码的初学者,但是有没有办法将我的主窗口的指针或引用传递给第二个窗口,以便第二个窗口可以编辑我的第一个窗口的文本框?这甚至是解决这个问题的正确方法吗?
【问题讨论】:
标签: c# wpf windows pointers reference
WPF 假定您将表单绑定到 ViewModel 对象。该对象可以绑定到多个表单,从而为您提供不同的视图和功能,因此在这种情况下,您需要将相同的 ViewModel 绑定到两个表单,并且在您的编辑表单中更改的内容将自动显示在您的主表单中。
【讨论】:
通常您在主窗口的数据上下文中执行此操作。您使用 IoC 在构造函数中传递弹出通知服务的实例并创建私有引用。您调用显示弹出通知的服务方法,用户可以在其中输入异步(和等待)以获取其响应或使用响应式扩展来订阅该按钮的提交操作。需要注意的是,您只能在调度程序线程中更新 ui,并且不要忘记在使用完窗口后释放订阅。
【讨论】:
您的问题有点含糊,有很多方法可以做到这一点。 Steve Todd 提到的 MVVM 就是其中之一。
但是,听起来您只是想将窗口作为对话框打开。在后面的第二个窗口代码中,确保您的文本框在 XAML 中有一个名称,然后访问它创建和易于访问的属性来获取和设置您的文本框值。
public MyTextContent
{
get => this.MyTextBox.Text;
set => this.MyTextBox.Text = value;
}
如果您愿意,可以使用点击事件根据条件(如确定或取消按钮)控制返回值。该窗口包含一个 DialogResult 属性。默认值为 false,因此您需要在某处进行设置。
this.DialogResult = true; // OK
然后在你的主窗口代码后面,创建一个新的窗口实例,分配它的属性并显示它。这需要在按钮或类似触发器的单击事件期间完成
var myDialog = new MyDialogWindow()
{
MyTextContent = "Textbox Starting Value";
}
bool? result = myDialog.ShowDialog(); // Returns when the dialog window is closed.
if(result != null && result)
{
this.LocalTextBox.Text = myDialog.MyTextContent; // Copy the text to the main textbox.
}
【讨论】: