加载wpf窗口时没有设置数据?

时间:2012-04-25 17:45:05

标签: c# wpf

我将信息从一个wpf窗口传递到另一个窗口时出现问题。出于某种原因,当加载主窗口时,标签中没有设置任何内容,我需要能够将数据保存在字符串中以用于任何事情(标签不重要但显示我的意思)?

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    public string MyData { get; set; }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        label1.Content = MyData;

    }

public partial class LoginWindow : Window
{
    public LoginWindow()
    {
        InitializeComponent();
    }
    private void button2_Click(object sender, RoutedEventArgs e)
    {
         string mytext = "blabla";
         MainWindow fromloginwindow = new MainWindow(); 
         fromloginwindow.Mydata = mytext;
    }

或者我是以错误的方式做这件事?

修改

请不要对标签进行切换,我需要能够获得并设置一个字符串以便在MainWindow中的任何位置使用。字符串“mytext”也无关紧要,因为显然我不会这样设置字符串。

3 个答案:

答案 0 :(得分:1)

在设置MyData之前发生了Loaded事件,更改代码如下:

public partial class MainWindow : Window
{
   public MainWindow(string data)
   {
      MyData = data 
      InitializeComponent();        
   }

答案 1 :(得分:1)

听起来你遇到了事件生命周期问题;对Loaded事件的调用很快发生,因此设置文本的机会已经过去了。相反,你应该做的是:

1)将属性绑定到XAML中的标签

public event PropertyChangedEventHandler PropertyChanged;

public MainWindow()
{
    InitializeComponent();
    DataContext = this;
}

protected string _myData = string.Empty;
public string MyData
{
    get { return _myData; }
    set { _myData = value; NotifyPropertyChanged("MyData"); }
}

protected void NotifyPropertyChanged(string propName)
{
    var methods = PropertyChanged;

    if(methods != null)
       methods(this, new PropertyChangedEventArgs(propName));
}

<Label Content="{Binding MyData}" />

2)通过另一种方法(或在属性声明中)设置控制文本:

public void SetLabel(string text)
{
    label1.Content = text;
}

protected void button2_Click(object sender, RoutedEventArgs e)
{
     MainWindow x = new MainWindow();
     x.SetLabel("blabla");
}

答案 2 :(得分:0)

您是否尝试通过窗口的构造函数将值传递给第二个窗口?

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    public MainWindow(string data)
        : this()
    {
        label1.Content = data;
    }
}

public partial class LoginWindow : Window
{
    public LoginWindow()
    {
        InitializeComponent();
    }

    private void button2_Click(object sender, RoutedEventArgs e)
    {
         string mytext = "blabla";
         MainWindow fromloginwindow = new MainWindow(mytext); 
    }
}