【问题标题】:Access the main window datacontext from a new created window从新创建的窗口访问主窗口数据上下文
【发布时间】:2013-03-21 14:00:31
【问题描述】:

在我的 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 的数据上下文。

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

此代码使用正确的内容从 newWindow 填充文本框,但它没有得到绑定属性,因为在更改文本框中的文本后 datacontext 没有得到更新(新创建的窗口中的 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";
    }
}

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

PS:我是 WPF 新手,欢迎提出任何建议!

【问题讨论】:

  • 我没有看到在您的代码中创建了绑定。您需要将TextBoxText 属性绑定到DataContext 中的属性,该属性应使用双向绑定进行更改。您的带有TextBox 的XAML 应该有类似&lt;TextBox Text="{Binding CommSettings, Mode=TwoWay}" /&gt; 的内容。
  • @odyss-jii 感谢将文本框的 XAML 更改为 &lt;TextBox Grid.Row="1" Grid.Column="3" Margin="2,0" Name="TxtComm" Text="{Binding Path=CommSettings, UpdateSourceTrigger=PropertyChanged}" /&gt; 它工作了!!!

标签: c# wpf window datacontext


【解决方案1】:

正如我在评论中所写,您需要将您的TextBoxText 属性绑定到您要更新的DataContext 的属性。因此,您的 XAML 应该类似于:

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

请注意,我将TextBoxText 属性绑定到您的DataContextCommSettings 属性。你的点击事件的C#-code 应该是:

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

我们只需要在这里设置DataContext。请注意,DataContext 会传递给子元素,因此 TextBox 将具有与其父元素相同的 DataContext,除非专门设置为其他内容。

【讨论】:

    【解决方案2】:

    使用静态属性:

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

    在其他文件中:

    Demo.SomeSettings=....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多