2016-06-17 10 views
1

ich die Übertragung von Daten von einem WPF-Fenster Form Form1 auf einen anderen WPF-Fenster Form Form2, aber jedes Mal, wenn ich Daten Form2-Form1 übertragen muss ich schließen und zu öffnen Form1. Gibt es eine Alternative zum Übertragen von Daten ohne Schließen und Öffnen von Form1?Aktualisieren von Daten in geöffneten Fenster WPF Form

FORM1

private void txtSellerCode_GotFocus(object sender, RoutedEventArgs e) 
{ 
    SelectSeller frmSelectSeller = new SelectSeller(); 
    frmSelectSeller.Show(); 
    this.Hide(); 
} 

FORM2

private void SelectBtn_Click(object sender, RoutedEventArgs e) 
{ 
    DataRowView drv = (DataRowView)dataGridSeller.SelectedItem; 
    clsCreateInvoice.S_ID = int.Parse(drv["B_ID"].ToString()); 
    clsCreateInvoice.S_Code = drv["B_Code"].ToString(); 
    clsCreateInvoice.S_Name_Address = drv["B_Name"].ToString() + " ," + 
    drv["B_Address_1"].ToString() + " ," + drv["B_Address_2"].ToString(); 

    CreateInvoice frmCreateInvoice = new CreateInvoice(); 
    frmCreateInvoice.txtSellerCode.Text = drv["B_Code"].ToString(); 
    frmCreateInvoice.lblSellerNameAddress.Text = drv["B_Name"].ToString() + " ," + 
    drv["B_Address_1"].ToString() + " ," + drv["B_Address_2"].ToString(); 
    frmCreateInvoice.Show(); 
    this.Hide(); 
} 
+0

Können Sie Ihren vollständigen Code hinter Dateien für beide Formulare stellen? – Sean

Antwort

0

Klingt, als ob Sie ein modales Fenster benötigen. Verwenden Sie ShowDialog() anstelle von Show()

Ist dies das gewünschte Verhalten?

FORM1: 

private void txtSellerCode_GotFocus(object sender, RoutedEventArgs e) 
{ 
    SelectSeller frmSelectSeller = new SelectSeller(); 
    frmSelectSeller.ShowDialog(); 
    this.txtSellerCode.Text = frmSelectSeller.SellerCode; 
    this.lblSellerNameAddress.Text = frmSelectSeller.SellerNameAddress 

} 

FORM2: 
//add these public properties 
public string SellerCode {get; set;} 
public string SellerNameAddress {get; set;} 

private void SelectBtn_Click(object sender, RoutedEventArgs e) 
{ 
    DataRowView drv = (DataRowView)dataGridSeller.SelectedItem; 
    clsCreateInvoice.S_ID = int.Parse(drv["B_ID"].ToString()); 
    clsCreateInvoice.S_Code = drv["B_Code"].ToString(); 
    clsCreateInvoice.S_Name_Address = drv["B_Name"].ToString() + " ," + drv["B_Address_1"].ToString() + " ," + drv["B_Address_2"].ToString(); 

    SellerCode = drv["B_Code"].ToString(); 
    SellerNameAddress = drv["B_Name"].ToString() + " ," + drv["B_Address_1"].ToString() + " ," + drv["B_Address_2"].ToString(); 

    this.Close(); 

}

wenn Sie Form1 zu verstecken brauchen, während form2 sichtbar ist

private void txtSellerCode_GotFocus(object sender, RoutedEventArgs e) 
{ 
    SelectSeller frmSelectSeller = new SelectSeller(); 
    this.Hide(); 
    frmSelectSeller.ShowDialog(); 
    this.Show(); 
    this.txtSellerCode.Text = frmSelectSeller.SellerCode; 
    this.lblSellerNameAddress.Text = frmSelectSeller.SellerNameAddress 

} 
+0

Ich denke, was das OP sehen wollte war, wie die Informationen auf Form1 nach Änderungen aktualisiert werden können zu Form2 stattfinden, ohne das Formular zu schließen und erneut zu öffnen. ShowDialog versus Show und Show/Hide adressiert diese Anforderung nicht. – Sean

+0

Aber es funktionierte ....... @ user2880486 Danke .... – Shantnu

1

Im MVVM Muster, das häufig für WPF-Anwendungen verwendet wird, kann dies mehrere Arten erreicht werden. Der folgende Weg ist wahrscheinlich der einfachste Weg:

1) Der Code, der sich derzeit in Ihrer Code-Behind-Datei befindet, würde in eine Art Klasse namens "ViewModel" gehen. Dies ist eine Klasse, die keine Abhängigkeiten von UI-orientierten Objekten aufweist, sondern stattdessen als "DataContext" für eine XAML-Ansicht fungiert. Die beiden sind durch Xaml-Databinding-Ausdrücke verbunden. Damit eine Klasse mindestens ein ViewModel sein kann, muss sie die INotifyPropertyChanged-Schnittstelle implementieren. Der Code hinter Form1 und Form2 müsste in eine Klasse eingefügt werden, die INotifyPropertyChanged namens Form1ViewModel und Form2ViewModel implementiert.

2) Instanzen von Form1ViewModel zu Änderungen auf einer Instanz Form2ViewModel abonnieren könnten, so dass jedes Mal, wenn eine Form1 Eigenschaft geändert, ein Handler in Form2 die Änderung fangen konnte und seine eigene Angleicheigenschaft

3) aktualisieren Form1View.xaml Form2View.xaml kann bidirektionale Bindungsausdrücke verwenden, um an die Eigenschaften von Form1ViewModel.cs bzw. Form2ViewModels.cs zu binden, sodass jedes Mal, wenn Form1ViewModel.MyProperty (dank einer Aktualisierung von Form2ViewModel) alle Benutzeroberflächensteuerelemente ändert, die an Form1ViewModel gebunden sind .MyProperty wird mit dem neuen Wert der View-Modelleigenschaft aktualisiert.

Edit (Wie diese Art der Sache tun ohne MVVM):

empfehle ich einen Test WPF-Projekt erstellen. Fügen Sie dem Projekt "ChildWindow" ein neues Fenster hinzu. Nachdem Sie meinen gesamten Code in die Dateien eingefügt haben, führen Sie das Projekt aus. Klicken Sie auf die Schaltfläche "Kinderform anzeigen". Trennen Sie die beiden Fenster, so dass sie nebeneinander angezeigt werden können. Geben Sie einen Text in MainWindows TextBox ein und sehen Sie zu, wie ChildWindows Textbox den Text automatisch aktualisiert!

MainWindow.xaml:

<Window x:Class="Wpf_2FormSync.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" DataContext="{Binding RelativeSource={RelativeSource Self}}" 
     > 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="82*"/> 
      <RowDefinition Height="10*"/> 
      <RowDefinition Height="10*"/> 
     </Grid.RowDefinitions> 
     <TextBox Text="{Binding MyName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox> 
     <Button Click="Button_Click_1" Grid.Row="1" >Show Child Form</Button> 
     <Button Grid.Row="2" Click="Button_Click_2" >Update Child Window</Button> 
    </Grid> 
</Window> 

MainWindow.xaml.cs:

using System; 
using System.ComponentModel; 
using System.Windows; 


namespace Wpf_2FormSync 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window, INotifyPropertyChanged 
    { 
     private ChildWindow _childWindow = null; 
     private string _myName = ""; 
     public string MyName 
     { 
      get { return _myName; } 
      set 
      { 
       if (value == _myName) return; 
       _myName = value; 
       NotifyOfPropertyChanged("MyName"); 
       if (_childWindow != null) 
        _childWindow.MyName = value; 
      } 
     } 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Button_Click_1(object sender, RoutedEventArgs e) 
     { 
      _childWindow = new ChildWindow(); 
      _childWindow.Show(); 
      _childWindow.MyName = "John"; 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     public void NotifyOfPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 

     } 

     private void Button_Click_2(object sender, RoutedEventArgs e) 
     { 
      if (_childWindow != null) 
       _childWindow.MyName = this.MyName; 
     } 
    } 
} 

ChildWindow.xaml:

<Window x:Class="Wpf_2FormSync.ChildWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="ChildWindow" Height="300" Width="300" DataContext="{Binding RelativeSource={RelativeSource Self}}" > 
    <Grid > 
     <Grid.RowDefinitions> 
      <RowDefinition Height="112*"/> 
      <RowDefinition Height="157*"/> 
     </Grid.RowDefinitions> 
     <TextBox Text="{Binding MyName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Row="0"></TextBox> 
     <Button Grid.Row="1" Click="Button_Click_1">Show</Button> 
    </Grid> 
</Window> 

ChildWindow.xaml.cs:

using System.ComponentModel; 
using System.Windows; 

namespace Wpf_2FormSync 
{ 
    /// <summary> 
    /// Interaction logic for ChildWindow.xaml 
    /// </summary> 
    public partial class ChildWindow : Window, INotifyPropertyChanged 
    { 
     private string _myName = ""; 
     public string MyName 
     { 
      get { return _myName; } 
      set 
      { 
       if (value == _myName) return; 
       _myName = value; 
       NotifyOfPropertyChanged("MyName"); 
      } 
     } 

     public ChildWindow() 
     { 
      InitializeComponent(); 

     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     public void NotifyOfPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 

     } 

     private void Button_Click_1(object sender, RoutedEventArgs e) 
     { 
      MessageBox.Show(MyName); 
     } 


    } 
} 
+0

Ich bin sehr neu zu WPF ich lerne. Also wissen nicht viel über WPF sowie MVVM-Muster. Etwas mehr Hilfe mit einigen Beispielen, wird sehr geschätzt. – Shantnu

+0

Da Sie eine WPF-App entwickeln, würde ich vorschlagen, [zuerst anzufangen] (http://stackoverflow.com/questions/1405739/mvvm-tutorial-from-start-to-finish). Ich kann mir nicht vorstellen, dass sich jemand in einer Technologie entwickelt, die er nicht beherrscht oder die Grundlagen zumindest nicht kennt. – Stacked

+0

Hey Sean Danke für deine Hilfe ..... bitte schlage mir einen tollen Online-Platz vor, wo ich WPF und MVVM lernen kann ... – Shantnu

0

Hier Ansatz i folgen mein Bedürfnis zu erfüllen:

Fenster 1

private void txtSellerCode_GotFocus(object sender, RoutedEventArgs e) 
{ 
SelectSeller frmSelectSeller = new SelectSeller(this); 
frmSelectSeller.Show(); 
this.Hide(); 
} 

Fenster 2

public partial class SelectSeller : Window 
{ 
    CreateInvoice _frmCreateInvoice; 
    public SelectSeller(CreateInvoice frmCreateInvoice) 
    { 
     InitializeComponent(); 
_frmCreateInvoice = frmCreateInvoice; 
    } 

    private void SelectBtn_Click(object sender, RoutedEventArgs e) 
    { 
     DataRowView drv = (DataRowView)dataGridSeller.SelectedItem; 
     clsCreateInvoice.S_ID = int.Parse(drv["B_ID"].ToString()); 
     clsCreateInvoice.S_Code = drv["B_Code"].ToString(); 
     clsCreateInvoice.S_Name_Address = drv["B_Name"].ToString() + " ," + drv["B_Address_1"].ToString() + " ," + drv["B_Address_2"].ToString(); 

     _frmCreateInvoice.txtSellerCode.Text = drv["B_Code"].ToString(); 
     _frmCreateInvoice.lblSellerNameAddress.Text = drv["B_Name"].ToString() + " ," + drv["B_Address_1"].ToString() + " ," + drv["B_Address_2"].ToString(); 
     this.Hide(); 
    } 
}