Binding ViewModel zu mehreren Fenstern

8

Ich schreibe mein Windows-Formular-Projekt um, das für Schafschur-Events punktet (frag nicht, es ist ein großer Sport in Neuseeland) von vbnet zu wpf c # und habe ein Problem gefunden, das ich nicht scheinen kann überwinden.

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 die 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 dasselbe 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 ...

Dies ist in meinem ViewModel-Projekt

%Vor%

Dann habe ich ein Hauptfenster, es gibt keinen echten Code hinter anderen als einer Zeile, um ein zweites Fenster zu öffnen, zu dem wir gelangen ...

%Vor%

Dann das XAML

%Vor%

Der obige Code funktioniert einwandfrei, wenn ich Text in das erste Textfeld eingebe, erscheint er im zweiten Textfeld. Wenn ich eine console.writeline in den notify-Teil lege, kann ich sehen, dass sie darauf trifft und aktualisiert.

Jetzt füge ich ein zweites Fenster hinzu, das genau so aufgebaut ist ...

%Vor%

Auch hier kein echter Code dahinter.

Das Seltsame ist, wenn ich dieses Steuerelement auf zwei Arten mache und es eintippe, sehe ich, 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.

    
Toby Mills 27.01.2016, 20:02
quelle

4 Antworten

10

Das liegt daran, dass beide Fenster genau dieselbe Instanz des ViewModels haben müssen.

Alle Ihre Eigenschaften sind Instanzeneigenschaften , wie

%Vor%

und daher sind alle Werte für jede Instanz unterschiedlich. Sie erstellen zwei Instanzen, eine für jedes Fenster.

%Vor%

Das ist ein Beispiel, und hier ist das andere

%Vor%

Denken Sie daran, dass xaml nur ein Markup ist, das in einem Objektdiagramm deserialisiert ist. Sie haben zwei verschiedene Markup-Dateien, sie enthalten unterschiedliche Instanzen von allem, was in ihnen beschrieben wird.

Es ist nichts falsch daran, und nichts ist falsch daran, ein Ansichtsmodell mit Instanzeigenschaften zu haben. In der Tat ist das der bevorzugte Weg gegenüber statischen und statischen Bindungen.

Die Antwort ist zum Glück einfach. Sie müssen beide Fenster an die gleiche Instanz Ihres Ansichtsmodells übergeben.

Entfernen Sie zunächst alle <Window.DataContext> Unsinn aus beiden Fenstern. Das ist nichts für dich. Jetzt ändern Sie einfach Ihren Konstruktor zu

%Vor%

Und du bist fertig.

    
Will 27.01.2016, 20:24
quelle
1

Ich vermute, dass jedes Fenster seine eigene Instanz des ViewModel erstellt. Sie könnten Folgendes versuchen:

%Vor%     
TrueEddie 27.01.2016 20:21
quelle
0

Ihr Ansichtsmodell definiert eine statische Methode, um eine einzelne Instanz zu erhalten, aber Sie verwenden sie nicht, um sie zu instanziieren. Momentan wird Ihr Ansichtsmodell mit dem Standardkonstruktor erstellt, was bedeutet, dass die beiden Fenster getrennte Kopien haben werden.

Erstellen Sie Ihr Ansichtsmodell im Code hinter entweder InitializeComponent oder OnNavigatedToEvent.

Hier ist ein Code, der weiter erklärt:

Definieren Sie eine ViewModel-Eigenschaft wie in beiden Fenstern

%Vor%

Dann Ihr Konstruktor:

%Vor%

entfernen Sie auch das

%Vor%

von der XAML, wie es nicht erforderlich ist.

    
Louis Watson 27.01.2016 20:24
quelle
0

Ich würde das ViewModel als eine Anwendungsressource machen

%Vor%

dann in jedem Fenster nennst du es so

%Vor%

Ich bin noch neu in diesem Konzept, und ich bin mir nicht sicher, ob das optimal ist. Es funktioniert aber!

    
user3382285 09.03.2018 22:45
quelle

Tags und Links