Ich schreibe mein Windows Forms Projekt um, das Scafing für Schafe Scheren Ereignisse (nicht fragen, es ist ein großer Sport in Neuseeland) von Vbnet zu Wpf C# und ein Problem, dass Ich kann mich nicht überwinden.Binding ViewModel zu mehreren Fenstern
Ich habe zwei Fenster. Eines ist das Quellfenster, in das Sie Dinge eingeben (wie der aktuelle Ereignisname), und das andere Fenster zeigt diese Informationen zur Projektion auf einen Bildschirm (also auf einem zweiten Monitor) zusammen mit anderen Daten an via XML über das Netzwerk. Ich habe es als MVVM mit einem ViewModel und einem Model als separate Projekte eingerichtet.
In meinem Hauptfenster kann ich Steuerelemente gut binden und wenn ich ein Textfeld eintippe, erscheint es sofort in einem anderen Textfeld, wenn es an dasselbe gebunden ist. In einem zweiten Fenster habe ich jedoch ein Steuerelement an die gleiche Sache gebunden und es wird nicht aktualisiert.
Ich bin seit einer Woche im Kreis herumgegangen, jedes Beispiel im Netz zeigt, wie man es in einem Fenster macht, das funktioniert, aber es fehlen zwei Fensterbeispiele.
Hier ist, was ich habe ...
Dieses Projekt meines Viewmodels ist
namespace SheepViewModel
{
public class SheepViewModel : INotifyPropertyChanged
{
private string _CurrentEventName;
static SheepViewModel _details;
public string CurrentEventName
{
get { return _CurrentEventName; }
set
{
_CurrentEventName = value;
OnPropertyChanged("CurrentEventName");
}
}
public static SheepViewModel GetDetails()
{
if (_details == null)
_details = new SheepViewModel();
return _details;
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string prop)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
Console.WriteLine("Test");
}
}
}
Dann habe ich ein Hauptfenster, gibt es keinen wirklichen Code hinter anderen als eine Linie eine zweiter öffnen Fenster, die wir ...
public MainWindow()
{
ScoreScreen SW = new ScoreScreen();
SW.Show();
InitializeComponent();
}
Dann wird der XAML
<Window x:Class="Sheep_Score_3._1.MainWindow"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:SheepViewModel;assembly=SheepViewModel"
mc:Ignorable="d"
Title="MainWindow" Height="433.689" Width="941.194">
<Window.DataContext>
<vm:SheepViewModel/>
</Window.DataContext>
<Window.Resources>
<Grid Margin="0,0,0,0">
<TextBox x:Name="CurrentEventName" Height="23" Margin="131.01,163.013,0,0" TextWrapping="Wrap" VerticalAlignment="Top" HorizontalAlignment="Left" Width="327.151" Text="{Binding CurrentEventName, Mode=TwoWay}"/>
<TextBox Text="{Binding CurrentEventName, Mode=TwoWay}" Margin="39.605,0,0,108.567" Height="49.111" VerticalAlignment="Bottom" HorizontalAlignment="Left" Width="399" />
</Grid>
bekommen
Der obige Code funktioniert einwandfrei, wenn ich Text in das erste Textfeld eintippe, erscheint es im zweiten Textfeld. Wenn ich eine console.writeline in den notify-Teil lege, kann ich sehen, dass es darauf trifft und aktualisiert.
Nun füge ich ein zweites Fenster, Setup genau die gleiche Art und Weise ...
<Window x:Class="Sheep_Score_3._1.ScoreScreen"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:SheepViewModel;assembly=SheepViewModel"
mc:Ignorable="d"
Title="ScoreScreen" Height="300" Width="300">
<Window.DataContext>
<vm:SheepViewModel/>
</Window.DataContext>
<Grid>
<TextBox x:Name="textBlock" HorizontalAlignment="Left" Margin="79.374,116.672,0,0" TextWrapping="Wrap" Text="{Binding CurrentEventName, Mode=TwoWay}" VerticalAlignment="Top"/>
</Grid>
Wieder keinen wirklichen Code hinter in diesem.
Die seltsame Sache ist, wenn ich dieses Steuerelement zwei-Wege machen und es eintippen, kann ich sehen, dass es den gleichen Benachrichtigungsabschnitt trifft, aber es aktualisiert das andere Fenster nicht.
Ich bin mir nicht sicher, was ich hier vermisse, also würde jede Hilfe, die mich in die richtige Richtung weist, sehr geschätzt.
Vielen Dank, danke, dies genagelt es. Das macht vollkommen Sinn, ich hatte das Gefühl, dass es zwei getrennte Instanzen waren, aber aus einem Vb-Hintergrund stammend war ich nicht sicher, wie ich sie so verbinden sollte. –
Hahahaha! +1 nur für "yaddayaddawhocares.derp" –
@TobyMills Wenn Sie sich über Instanzen nicht sicher sind, können Sie immer Objekt-IDs verwenden, um sie zu verfolgen. https://blogs.msdn.microsoft.com/zainnab/2010/03/04/make-object-id/ Viel Glück beim Scheren! Oh, und wenn du mich aussprichst, wenn du deine Neuschreibung premierst, wäre das super ***. – Will