2015-06-02 51 views
1

我的问题是,将一些信息从WPF窗口传递到现有的WPF页面。我想通过在WPF Page1上按下一个按钮来打开一个窗口。 然后,我必须将Textbox1中存储的所有文本都变为Page1中的变量。但只有当用户在“窗口”上按下ButtonXY时。我怎样才能解决这个问题,而不使用“绑定”,因为必须在Page1旁边有abig“Switch”子句?在WPF中的两个窗口之间传递内容

+0

只需将您的模型传递给第二个窗口,然后在第二个窗口上处理更新,那么您不需要传递任何它们都将同时具有所有数据的任何东西。 – Franck

回答

0

让我们假设你有一个MainWindow和一个SubWindow

您的SubWindow包含一个Button和一个Textbox。当您点击Button中的SubWindow时,您想要将TextTextbox转入MainWindow

主窗口。 您提供了一个Property(一个Getter和Setter),它将包含传输的Text字符串。 MainWindow也包含SubWindow!不要忘了给MainWindow传递到SubWindow构造函数(下面看),所以SubWindow知道MainWindow实例

public partial class MainWindow : Window 
{ 
    public string Text { get; set; } 

    private Window subWindow; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     subWindow = new SubWindow(this); 

     subWindow.Show(); 
    } 
} 

子窗口

public partial class SubWindow : Window 
{ 
    private Window mainWindow; 

    public SubWindow(Window mainWindow) 
    { 
     this.mainWindow = mainWindow; 

     InitializeComponent(); 
    } 

    private void ButtonTransferTheData_Click(object sender, RoutedEventArgs e) 
    { 
     mainWindow.Text = myTextBoxInSubWindow.Text; 
    } 
} 

SubWindow知道MainWindow。所以你可以访问Text Property。在按钮上,单击您将TextTextbox转换为MainWindowProperty

提示mainWindow.Text = myTextBoxInSubWindow.Text;线可能抛出异常。这是因为你想访问另一个线程。 所以你需要派遣它。将此行更改为:

Dispatcher.Invoke(() => mainWindow.Text = myTextBoxInSubWindow.Text); 

希望这有助于。

1

如果您使用的是MVVM,那么窗口和页面都可以有一个共同的ViewModel,并且这些文本框应该绑定到UpdateSourceTrigger设置为PropertyChanged的同一个属性,这样不需要更多的事件或通知。

否则,有时我倾向于创建一个全球项目,将在需要时添加为参考。这样,您就可以设置事件和他们的处理程序来完成您的特定问题。我认为这不是一个优雅的解决方案,但它可以帮助我在不同的项目或类之间进行很多沟通。

1

创建一个新类,其中包含要在所有窗口之间传输的所有数据。

public YourNewClassWithSettings 
{ 
    string StringNumber1; 
    string StringNumber2; 
} 

在主窗口中创建此类的实例并设置所需属性的值。

通过引用您的下一个窗口的构造函数传递YourNewClassWithSettings的实例。

YourNewClassWithSettings test = new YourNewClassWithSettings(); 
test.StringNumber1 = "mySetting"; 

WindowControl w = new WindowControl(ref test); 
w.ShowDialog(); 

//See what was changed!!!! 
string changedValue = test.StringNumber1; //Will be "IamDone" 

在你的构造函数,你会说:

public WindowControl(ref YourNewClassWithSettings test) 
{ 
    // example: You can now say TextBox1.Text = test.StringNumber1; 

    // Whatever you change here like test. 
    test.StringNumber1 = "IamDone"; 
    //When you close this window, because test was passed by ref : you 
    // will see StringNumber1 = "IamDone" in your main window again 
    //when accessing the property of that class. Always pass by ref 
    this.Close(); 
} 

这是MVVM的做法。

相关问题