这个问题意味着我对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"/>
提前致谢!
答案 0 :(得分:2)
有很多方法可以做到这一点,但最简单的(来自你的POV)是:
对于一个小应用程序(在没有多少窗口的意义上)这很好,因为这看起来像。在更复杂的应用程序中,我建议您使用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();
}
}