如何在WPF应用程序中从多个窗口引用文本框?

时间:2019-01-17 22:21:18

标签: c# wpf xaml

我正在创建一个带有多个窗口的笔记应用程序,以收集信息。如何在单击多个按钮时将多个窗口中的多个文本框的值保存到变量中?

我已经在MainWindow中成功实现了它,但是在跨多个窗口扩展范例时遇到了麻烦。我觉得这与不给第二个窗口的实例分配名称有关,但是我不确定它是如何工作的。

这是在MainWindow中起作用的函数的代码:

public static void CopyText()
        {
            string srText = ((MainWindow)Application.Current.MainWindow).srBox.Text;
            string contactText = ((MainWindow)Application.Current.MainWindow).contactBox.Text;
            string usernameText = ((MainWindow)Application.Current.MainWindow).usernameBox.Text;
            string generalText = ((MainWindow)Application.Current.MainWindow).generalBox.Text;

            string copyText = "";

            Clipboard.SetDataObject(copyText);
        }

这是CreditWindow中功能无效的代码:

public static void CopyCreditText()
        {
            string srText = ((MainWindow)Application.Current.MainWindow).srBox.Text;
            string usernameText = ((MainWindow)Application.Current.MainWindow).usernameBox.Text;
            string buyerText = ((CreditWindow)Application.Current.MainWindow).buyerBox.Text;
            string itemText = ((CreditWindow)Application.Current.MainWindow).itemBox.Text;
            string amountText = ((CreditWindow)Application.Current.MainWindow).amountBox.Text;
            string typeText = ((CreditWindow)Application.Current.MainWindow).typeBox.Text;
            string reasonText = ((CreditWindow)Application.Current.MainWindow).reasonBox.Text;

        string copyText = "";

        Clipboard.SetDataObject(copyText);
    }

运行此代码时,我在以下行上从Visual Studio中收到错误:

string buyerText = ((CreditWindow)Application.Current.MainWindow).buyerBox.Text;

指出“无法将类型为'MSONotes.MainWindow'的对象转换为类型为'MSONotes.CreditWindow'。

1 个答案:

答案 0 :(得分:0)

错误是因为Application.Current.MainWindow就是那个,整个应用程序的主窗口。无论有多少个子窗口,它都不会改变。它不会成为CreditWindow

除非窗口之间相互引用,否则您应该处理在视图层后面传递 well 的此类数据。我撒谎了,您应该不管这样做,但是引用可以让您继续作弊。在适当设计的应用程序中:

  • 这些文本框将绑定到视图模型中的字段
  • 单击按钮会将值推入某个模型(由另一个窗口的VM共享,最好使用依赖注入)
  • 通过事件或类似事件,该服务将通知所有VM新数据可用
  • 他们将更新自己的相应字段

  • 由于VM更新,其他Windows视图将自动更新。

基本上,您将需要正确地执行WPF(使用MVVM),而不是像这样将其黑客化。