silverlight - Kommunizieren Sie zwischen zwei Ansichtsmodellen in MVVM mithilfe von Befehlen

7

Ich arbeite an MVVM und Kommandos in silverlight (DelegateEvent und ICommand)

Ich möchte so etwas, (sagen wir) Ich habe 2 Benutzerkontrollen, Eltern und Kind.

Parent beherbergt das Kind, beide haben ihre eigenen Viewmodels.

Auf Eltern Ich habe eine Schaltfläche und es führt einen einfachen Befehl, bei der Ausführung dieses Befehls möchte ich Text in der Textbox des untergeordneten Steuerelements aktualisieren. Außerdem sollten wir in der Lage sein, etwas im Kind zu ändern, das sich zum Elternteil ausbreiten kann.

Ist Ereignisse die beste Antwort für dieses oder ich kann Kommandos haben, um child / notify parent in irgendeiner Weise zu aktualisieren.

    
AB. 20.11.2009, 14:09
quelle

3 Antworten

12

Dafür gibt es mehrere Möglichkeiten.

Erstens ist es völlig angemessen, ViewModels zu verwenden, die aus anderen ViewModels bestehen, solange Sie in Ordnung sind, wenn sie auf diese Weise gekoppelt sind. Wenn Sie das tun, können sie einfach mit normalen Methodenaufrufen miteinander reden.

Als nächstes können Sie ein Bit entkoppeln und Ereignisse verwenden. Daran ist nichts falsch. Es gibt noch einen Beobachter - & gt; Beobachtbare Kopplung, aber sie sind weniger voneinander abhängig.

Als nächstes können Sie etwas wie einen EventAggregator vollständig entkoppeln und verwenden (Prism hat einen guten, den Sie verwenden können). Shoot a Veröffentlichen Sie eine Nachricht. Der andere abonniert. Sie kennen sich überhaupt nicht.

Ich habe auch Befehle dafür verwendet ... aber für die Kommunikation zwischen ViewModel und ViewModel finde ich das ein wenig peinlich.

    
Brian Genisio 20.11.2009, 14:36
quelle
4

Sie sollten wahrscheinlich mit der offensichtlichsten Implementierung beginnen, wobei das Eltern-View-Modell einfach einen Verweis auf ein Child-View-Modell enthält und das Child-View-Model einen Verweis auf ein Eltern-View-Modell enthält. Wenn dann ein Befehl im übergeordneten Ansichtsmodell ausgeführt wird, wird einfach ein Wert für ein untergeordnetes Ansichtsmodell festgelegt, an das die Textbox gebunden ist.

Das Hinzufügen einer Abstraktionsschicht zwischen Eltern und Kind (z. B. Ereignisse) fügt eine Komplexität hinzu und sollte daher gerechtfertigt sein. Wenn der Wert, den diese Indirektion bietet, höher ist als die Kosten für erhöhte Komplexität des Codes (z. B. ist es jetzt weniger klar, was passiert, wenn Befehl auf einem Elternteil ausgeführt wird, müssen Sie ein Problem lösen, wie Kind das Ereignis des Elternteils abonniert, ohne die tatsächliche Bezug auf es und umgekehrt, Hinzufügen zusätzlicher Abhängigkeiten zwischen Elternteil ein Kind erfordert das Hinzufügen zusätzlicher Ereignisse, die die tatsächliche Logik mit allen Rohrleitungen verunreinigt, etc.) dann sicherlich Ereignisse (oder so etwas wie PropertyObserver ) könnte ein nächster logischer Schritt sein.

    
PL. 20.11.2009 15:40
quelle
4

Dies scheint eine ideale Situation für die Verwendung eines EventAggregators zu sein, wie der in der Composite Application Guidance / Prism.

In diesem Modell können Sie einen MessageBus im Stammverzeichnis der Anwendung (oder eines anderen allgemeinen Bereichs) einrichten.

// in App.xaml.cs

public static IEventAggregator MessageBus = neuer EventAggregator ();

Richten Sie dann eine gemeinsame Nachrichtenbibliothek ein

%Vor%

Dabei ist SimpleObject eine Klasse oder Variable, die alle Informationen enthält, die zur Verarbeitung dieses Ereignisses erforderlich sind.

%Vor%

Wobei ProcessingMethod eine Methode ist, die ein SimpleObject als Parameter verwendet.

Dann können Sie Nachrichten von überall aus ausgeben und überall verarbeiten - über Ansichtsmodelle, Steuerelemente usw. Sie können sogar MessageBuses zwischen Komponenten übergeben, wenn Sie Teile der App dynamisch laden. Funktioniert gut.

    
babernethy 20.11.2009 14:47
quelle