2016-09-01 3 views
0

Ich entwickle ein WPF mit MVVM-Muster, C# und .NET Framework 4.6.1.Zugriff auf ein ViewModel von einem anderen ViewModel

Ich habe ein Fenster, das ein UserControl (Control1) enthält und das UserControl ein anderes UserControl (Control2) enthält. Ich habe diesen Weg gewählt, anstatt ein Dialogfenster zu verwenden (Control2 fungiert als Dialogfenster).

Beide Benutzersteuerelemente haben ein Viewmodel (Control1VM und Control2VM).

Ich benutze Control2 als ein Formular, um Benutzer einige Daten eingeben, die ich brauche, um die Anwendung zu starten.

Dies ist das Hauptfenster mit Control1:

enter image description here

Und das ist Control2 über Control1.

enter image description here

Mein Problem ist, dass ich weiß nicht, wie Control2 zu verstecken, wenn ich auf OK oder Abbrechen-Taste klicken Sie auf.

Dies ist, wie Control2 auf Control1 gesetzt:

<Grid x:Name="gridControl2" Margin="30" Grid.RowSpan="6" Grid.ColumnSpan="3" Visibility="{Binding GridControl2Visibility}"> 
    <local:Control2 x:Name="userControlControl2" /> 
</Grid> 

Control2 und setzen in Control1VMGridControl2Visibility-Visible anzuzeigen:

public Visibility GridControl2Visibility 
{ 
    get { return gridControl2Visibility; } 
    set 
    { 
     if (gridControl2Visibility != value) 
     { 
      gridControl2Visibility = value; 

      RaisePropertyChangedEvent("GridControl2Visibility"); 
     } 
    } 
} 

Wie ich Control2 verstecken kann, wenn ich auf OK oder Abbrechen klicken Knopf in Control2? Mein Problem ist, dass GridControl2Visibility auf Control1VM ist und ich kann nicht auf diese Klasse von Control2VM zugreifen.

+0

Der übliche Weg dazu wäre mit den Messaging-Funktionen Ihres MVVM-Toolkits. – Lennart

+0

Erstellen Sie auch eine VM für das Fenster, und behalten Sie darin die Instanz der untergeordneten VM. Die untergeordnete VM besteht wiederum aus ihrer untergeordneten VM-Instanz. Auf diese Weise können Sie den gesamten Code von Windows VM steuern. – ViVi

Antwort

1

Verwenden Sie einen Service, auf den beide Modelle zugreifen können und der die Informationen speichert, ob Control2 sichtbar sein soll oder nicht. Idealerweise wird der Dienst als Singleton mit Ihrem Di-Container registriert und in die Ansichtsmodelle injiziert.

Alternativ können Sie einen Ereignisaggregator verwenden, bei dem es sich im Grunde genommen um einen Singleton-Dienst handelt, der sich jedoch auf die Verteilung von Ereignissen konzentriert, statt einen Status zu halten.

+0

Um es zu tun, habe ich diesen Artikel folgen: https://rachel53461.wordpress.com/2011/10/09/simplifying-prisms-eventaggregator/ – VansFannel

-1

Sie können Ereignisse verwenden, Sie können das Ereignis von Control2VM auslösen und haben es in Control1VM und setzen Sie GridControl2Visibility auf false.

Verwandte Themen