wpf 从新创建的窗口访问主窗口DataContext

cnjp1d6j  于 2023-05-01  发布在  其他
关注(0)|答案(3)|浏览(388)

在我的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}

}

现在我也有一个函数来打开一个新窗口,这个窗口包含一个文本框,其文本应该被绑定到主窗口的datacontext。

private void MenuComm_Click(object sender, RoutedEventArgs e)
    {
        FrmSettings newWindow = new FrmSettings();
        newWindow.DataContext = mMeasConSettings;
        newWindow.TxtComm.Text = mMeasConSettings.CommSettings;
        newWindow.Show();
    }

这段代码用正确的内容填充newWindow中的文本框,但它没有得到绑定属性,因为在更改文本框中的文本(新创建的窗口中的TxtComm)后,datacontext没有得到更新。
文本框的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(在我的MainWindow中定义)在我的newWindow中(按下按钮后创建),如果我在我的newWindow中更改文本框值,则存储在mMeasConSettings中的值。CommSettings也应该更改。
PS:我是WPF的新手,所以欢迎任何建议!

xmd2e60i

xmd2e60i1#

正如我在评论中所写的,您需要将TextBoxText属性绑定到您想要更新的DataContext的属性。你的XAML应该是这样的:

<TextBox ... Text="{Binding CommSettings, Mode=TwoWay}" />

请注意,我将TextBoxText属性绑定到DataContextCommSettings属性。您的C#-code for the click event应该是:

private void MenuComm_Click(object sender, RoutedEventArgs e)
{
    FrmSettings newWindow = new FrmSettings();
    newWindow.DataContext = mMeasConSettings;
    newWindow.Show();
}

我们只需要在这里设置DataContext。请注意,DataContext被沿着给子元素,因此TextBox将具有与其父元素相同的DataContext,除非特别设置为其他元素。

kcwpcxri

kcwpcxri2#

使用静态属性:

class Demo
{
    public static string SomeSettings {get;set;}
    private onLoad()
    {
        SomeSettings=... //Init here
    }
}

在其他文件中:

Demo.SomeSettings=....
at0kjp5o

at0kjp5o3#

我在第二个窗口中添加了一个属性,并通过构造函数将参数传递给该属性。我的代码传递字典
//在主窗口中:

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();
    }

}

相关问题