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);
}
}
}
Können Sie Ihren vollständigen Code hinter Dateien für beide Formulare stellen? – Sean