无法弄清楚如何从单独的.xaml窗口更新文本框控件

时间:2014-09-12 16:55:35

标签: c# wpf xaml wpf-controls

这个问题意味着我对WPF来说是全新的,到目前为止,我遇到了很多从winforms过渡的问题。

我想要做的是一个非常简单的概念,但我正在试图让它发挥作用。 我希望在第二个窗口的属性上更新MainWindow上的文本框。但是,此窗口始终不会打开。

在MainWindow中,我从这样的事件中打开一个新窗口:

private void menuChangeSerialPort_Click(object sender, RoutedEventArgs e)
    {
        ChangeSerialPort changeSerialPort = new ChangeSerialPort();
        changeSerialPort.Show();
    }

新窗口的目的是为用户提供更改串行端口的选项。我扫描它们并将它们放入组合框中。选择一个并确认(按下“确定”按钮)后,我想发回MainWindow.xaml的串口名称字符串以供将来使用。之后我关闭了第二个窗口:

public partial class ChangeSerialPort : Window
{
    public ChangeSerialPort()
    {
        InitializeComponent();

        // Used with XAML, the owner is set so the opening position is centered according to where the Main Window is.
        this.Owner = Application.Current.MainWindow;

        // Scan and list port names
        GetSerialPorts(); 
    }

    private string _portname;
    public string serialPortName { get { return _portname; } } // Readonly property


private void serialPortOKBtn_Click(object sender, RoutedEventArgs e)
    {
        txt_noSerialSelected.Visibility = Visibility.Hidden;
        if (cmbbox_serialPortList.SelectedItem == null)
        {
            txt_noSerialSelected.Visibility = Visibility.Visible;
        }
        else
        {
            _portname = cmbbox_serialPortList.SelectedItem.ToString();
           //
           // WHAT TO PUT??
           //
            this.Close();
        }
    }

我无法为我的生活获得数据绑定工作。我知道这是正确的方法,但我花了几个小时阅读并且没有在哪里。我的备份计划是从属性访问数据。但我不知道如何在MainWindow上访问任何属性,反之亦然(因为在确认选择后窗口将关闭)。所以我是0/2。

任何人都可以帮助我吗?并且可以用非常简单的术语解释数据绑定如何在这种情况下帮助我?例如,要采取什么步骤以及在MainWindow上进入文本框xaml的具体内容是什么?

<TextBox x:Name="serialPortInUse" Text="?????????" HorizontalAlignment="Right" Margin="0" VerticalAlignment="Top" Height="20" Width="86" TextChanged="serialPortInUse_TextChanged" BorderThickness="0"/>

提前致谢!

2 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点,但最简单的(来自你的POV)是:

  1. 选择端口时,第二个窗口会引发一个事件。该 eventargs将包含所选端口的名称。
  2. 当主窗口创建第二个窗口时,它会订阅该事件, 使用新方法接收事件。
  3. 当主窗口收到事件时,set设置文本 serialPortInUse
  4. 对于一个小应用程序(在没有多少窗口的意义上)这很好,因为这看起来像。在更复杂的应用程序中,我建议您使用MVVM模式。有一本非常好的书,Advanced MVVM,已经有一段时间了,但仍然是一个很好的介绍。使用MVVM,你可以使用像MVVMLite这样的框架 - 你也可以通过NuGet install-package MVVMLight安装它 - 它有一个内置的Messaging系统,可以将发送者与监听器分离,在这种情况下很自然。

答案 1 :(得分:1)

在ChangeSerialPort窗口中添加ref参数;

public partial class ChangeSerialPort : Window
    {
        TextBox textBox;
        public ChangeSerialPort( TextBox myTextBox)
        {
            InitializeComponent();
            textBox = myTextBox;
        }
    }

传递该文本框

private void menuChangeSerialPort_Click(object sender, RoutedEventArgs e)
{
    ChangeSerialPort changeSerialPort = new ChangeSerialPort(serialPortInUse);
    changeSerialPort.Show();
}

设置文本值

private void serialPortOKBtn_Click(object sender, RoutedEventArgs e)
        {
            txt_noSerialSelected.Visibility = Visibility.Hidden;
            if (cmbbox_serialPortList.SelectedItem == null)
            {
                txt_noSerialSelected.Visibility = Visibility.Visible;
            }
            else
            {
                _portname = cmbbox_serialPortList.SelectedItem.ToString();
                textBox.Text = _portname;
                this.Close();
            }
        }