从新创建的窗口访问主窗口datacontext

时间:2013-03-21 14:00:32

标签: c# wpf window datacontext

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

}

现在我还有一个打开一个新窗口的函数,这个窗口包含一个文本框,其文本应该绑定到MainWindow的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";
    }
}

我的问题是如何调整我的newWindow中的值mMeasConSettings.CommSettings(在我的MainWindow中定义)(按下按钮后创建),如果我更改了newWindow中的文本框值,则存储在mMeasConSettings中的值。 CommSettings也应该改变。

PS:我是WPF的新手,所以欢迎任何建议!

2 个答案:

答案 0 :(得分:5)

正如我在评论中所写,您需要将Text的{​​{1}}属性绑定到要更新的TextBox的属性。因此,您的XAML应该是这样的:

DataContext

请注意,我将<TextBox ... Text="{Binding CommSettings, Mode=TwoWay}" /> 的{​​{1}}属性绑定到Text的属性TextBox。您的CommSettings - 点击事件的代码应为:

DataContext

我们只需要在此处设置C#。请注意,private void MenuComm_Click(object sender, RoutedEventArgs e) { FrmSettings newWindow = new FrmSettings(); newWindow.DataContext = mMeasConSettings; newWindow.Show(); } 会传递给子元素,因此DataContext将与其父元素具有相同的DataContext,除非明确设置为其他内容。

答案 1 :(得分:1)

使用静态属性:

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

在其他文件中:

Demo.SomeSettings=....