从新创建的窗口访问主窗口数据上下文
本文关键字:窗口 访问 数据 上下文 新创建 创建 | 更新日期: 2023-09-27 18:05:12
在MainWindow中,我创建了一个包含不同设置的类的新实例。在设置了类的参数之后,我将datacontext =设置为该类。
public partial class MainWindow : Window
{
private MeasConSettings mMeasConSettings = new MeasConSettings();
public MainWindow()
{
InitializeComponent();
DataContext = mMeasConSettings;
}
private void MenuComm_Click(object sender, RoutedEventArgs e)
{// See code below}
}
现在我也有一个函数来打开一个新窗口,这个窗口包含一个文本框,它的文本应该绑定到主窗口的数据上下文。
private void MenuComm_Click(object sender, RoutedEventArgs e)
{
FrmSettings newWindow = new FrmSettings();
newWindow.DataContext = mMeasConSettings;
newWindow.TxtComm.Text = mMeasConSettings.CommSettings;
newWindow.Show();
}
这段代码用正确的内容填充来自newWindow的文本框,但是它没有得到绑定属性,因为数据上下文在改变文本框中的文本后没有得到更新(在新创建的窗口中的TxtComm)。
文本框的XAML代码示例:<TextBox Grid.Row="1" Grid.Column="3" Margin="2,0" Name="TxtComm" DataContext="{Binding Path=CommSettings, UpdateSourceTrigger=PropertyChanged}" />
"CommSettings"是MeasConsettings类的成员
public class MeasConSettings
{
private string mCommSettings;
public string CommSettings
{
get
{
return mCommSettings;
}
set
{
mCommSettings = value;
}
}
public MeasConSettings()
{
CommSettings = "Com5:19200,8,n,1";
}
}
我的问题是如何调整值mMeasConSettings。CommSettings(定义在我的主窗口)在我的新窗口(这是按下按钮后创建的),如果我改变我的新窗口中的文本框值,存储在mMeasConSettings中的值。CommSettings也应该修改。
PS:我是WPF的新手,所以欢迎任何建议!正如我在评论中所写的,您需要将TextBox
的Text
属性绑定到您想要更新的DataContext
属性。因此,您的XAML应该像这样:
<TextBox ... Text="{Binding CommSettings, Mode=TwoWay}" />
请注意,我将TextBox
的Text
属性绑定到DataContext
的CommSettings
属性。点击事件的C#
代码应该是:
private void MenuComm_Click(object sender, RoutedEventArgs e)
{
FrmSettings newWindow = new FrmSettings();
newWindow.DataContext = mMeasConSettings;
newWindow.Show();
}
我们只需要在这里设置DataContext
。注意,DataContext
被传递给子元素,因此TextBox
将具有与其父元素相同的DataContext
,除非特别设置为其他内容。
使用静态属性:
class Demo
{
public static string SomeSettings {get;set;}
private onLoad()
{
SomeSettings=... //Init here
}
}
在其他文件中:
Demo.SomeSettings=....
我向第二个窗口添加了一个属性,并通过构造函数将参数传递给该属性。我的代码传递字典
在主窗口:var fileContent = new Dictionary<string, string>()
{
["Salutation"] = "Test",
};
var w_SelectionWindow2 = new SelectionWindow2(fileContent);
w_SelectionWindow2.Show();
Hide();
在第二个窗口(我命名为w_SelectionWindow2
)
public partial class SelectionWindow2 : Window
{
public Dictionary<string, string> FileContent { get; init; }
public SelectionWindow2(Dictionary<string, string> fileContent)
{
InitializeComponent();
FileContent = fileContent;
TestBlock.Text = FileContent["Salutation"]; //Result is "Test" in your TextBlock (<TextBlock x:Name="TestBlock"></TextBlock>)
}
public SelectionWindow2() //optional default constructor
{
InitializeComponent();
}
}