2016-04-07 4 views
0

Angenommen, ich habe zwei ViewModels und einen Bildschirmleiter in meiner Anwendung.Übergeben von Daten vom Bildschirm zum Bildschirmleiter

public class ShellViewModel : Conductor<IScreen>, IShell 
{ 
    public ShellViewModel() 
    { 
     ShowConnectionScreen(); 
    } 
    public void ShowConnectionScreen() 
    { 
     ActivateItem(new ConnectionViewModel()); 
    } 

    public void ShowSetupScreen() 
    { 
     ActivateItem(new SetupViewModel()); 
    } 
} 

Das erste Ansichtsmodell wird beim Start angezeigt und enthält einige Setup-Informationen und eine Connect Taste, die irgendwo eine Verbindungs ​​initialisiert.

Wenn die Verbindung erfolgreich hergestellt wurde, möchte ich das erste ViewModel schließen und das zweite ViewModel, um einige Informationen über die Verbindung anzuzeigen. Wenn dies fehlschlägt, sollte das erste ViewModel das einfach anzeigen und dem Benutzer ermöglichen, die Verbindung erneut zu versuchen.

So brauche ich das tatsächliche Verbindungsobjekt vom ersten ViewModel an das zweite ViewModel und den Screen Conductor übergeben, um Viewmodels bei Erfolg zu ändern.

Wie kann dies in Caliburn.Micro erreicht werden?

+1

einen gemeinsamen Typ zwischen den drei Klassenobjekte verwenden, offensichtlich diese Art in Frage erstellen und sie entweder in Kontruktor oder eine Eigenschaft machen von allen 3 Klassen ...? Oder Sie können EventAggregator verwenden, um ein Ereignis zu veröffentlichen, das von den anderen ViewModels akzeptiert und verarbeitet oder ignoriert wird. – mvermef

Antwort

0

Um @ mvermef Kommentar veranschaulichen:

Verwendung eine häufige Art zwischen den drei Klassenobjekten, erstellen offensichtlich diese Art in Frage

Dies ist das connection Objekt wäre, dass das erste View-Modell bevölkert und wird vom zweiten Ansichtsmodell verwendet.

public class Connection { 
    // props, methods, etc... 
} 

und geben sie entweder in Konstruktor oder machen sie eine Eigenschaft aller drei Klassen

public class ShellViewModel : Conductor<IScreen>, IShell 
{ 
    public Connection Connection { get; set; } 
    public ShellViewModel() 
    { 
     Connection = new Connection(); 
     ShowConnectionScreen(); 
    } 
    public void ShowConnectionScreen() 
    { 
     ActivateItem(new ConnectionViewModel(Connection)); 
    } 

    public void ShowSetupScreen() 
    { 
     ActivateItem(new SetupViewModel(Connection)); 
    } 
} 

Tun Sie, was Sie mit dem Connection-Objekt wollen innerhalb Connection

public class ConnectionViewModel : Screen 
{ 
    public Connection Connection { get; set; } 
    // establish connection 
    // can call (Parent as IConductor).DeactivateItem(this) 
    // after connection is established 
} 

Sie können den Elternleiter benachrichtigen, wenn eine Verbindung hergestellt wird, indem Sie (1) über C registrieren onnectionViewModel's Deaktiviertes Ereignis (unter der Annahme, dass Sie die Unterklasse Screen haben). Oder (2) Sie können EventAggregator verwenden, um ein Ereignis auszulösen, wenn die Verbindung hergestellt wurde und ShellViewModel IHandle implementiert. Sie können dann ShowSetupScreen() innerhalb des Ereignishandlers Deaktiviert oder der Handle-Methode aufrufen.

Option 1:

// ShellViewModel 
public void ShowConnectionScreen() 
{ 
    var connectionVM = new ConnectionViewModel(); 
    connectionVM.Deactivated += ConnectionViewModel_Deactivated; 
    ActivateItem(); 
} 

private void Scheduler_Deactivated1(object sender, DeactivationEventArgs e) 
{ 
    ShowSetupScreen(); 
} 

Option 2:

public class ShellViewModel : Conductor<IScreen>, 
    IShell, IHandle<string> 
{ 
    private readonly IEventAggregator _eventAggregator; 

    public ShellViewModel(IEventAggregator eventAggregator) 
    { 
     _eventAggregator = eventAggregator; 
     _eventAggregator.Subscribe(this); 
    } 

    // from IHandle<string>. you can create a custom object to represent this event 
    public void Handle(string message) 
    { 
     if (message.Equals("connection.successful")) 
     { 
      ShowSetupScreen(); 
     } 
    } 
} 

public class ConnectionViewModel : Screen 
{ 
    private readonly IEventAggregator _eventAggregator; 
    public ConnectionViewModel(IEventAggregator eventAggregator) 
    { 
     _eventAggregator = eventAggregator; 
    } 

    // call _eventAggregator.PublishOnUIThread("connection.successful"); 
}