2016-05-19 13 views
0

Ich habe eine Klasse namens AppViewModel, diese Klasse ist es verantwortlich, die Bildschirme zu steuern. AppViewModel erweitert meine BaseConductor:WPF Caliburn.Micro: Leben Cicyle Probleme

public class BaseConductor : Conductor<Screen>.Collection.OneActive 
{ 
    ... 
} 

Dann nenne ich eine Viewmodel (Usercontrol) an den Konstruktor von AppViewModel:

 this.ActivateItem(new FirstViewModel()); 

Auf FirstViewModel, nachdem der Benutzer auf eine Schaltfläche klickt Ich möchte öffnen SecondViewModel und schließen Sie die FirstViewModel:

var conductor = this.Parent as IConductor; 
conductor.DeactivateItem(this, true); 
conductor.ActivateItem(new SecondViewModel(param)); 

Ich habe bereits versucht, dies zu tun:

((IApp)this.Parent).ActivateItem(new SecondViewModel(param)); 
TryClose(); 

SecondViewModel erweitert meine BaseScreen:

public class BaseSceen : Screen 
{ 
    ... 
} 

ich die FirstViewModel, denn auf der FirstViewModel und SecondViewModel I Kürzel schließen möchten. Wenn ich das SecondViewModel geöffnet habe, klicke ich auf eine Verknüpfung, und die Methode, die ausgeführt wird, stammt von FirstViewModel. So läuft das FirstViewModel noch.

Wie kann ich das FirstViewModel schließen und dieses Problem mit Verknüpfungen vermeiden?

Danke!

Antwort

1

Müssen Sie wirklich Conductor<T>.Collection.OneActive verwenden? Sie können einfach Conductor<T> verwenden, so dass das Aktivieren eines Artikels automatisch das zuvor aktive Element deaktiviert und schließt. Und ist es auch erforderlich, dass das button/action-Paar in der FirstViewModel? Ich schlage vor, dass Sie nur diese in die AppViewModel setzen und es die Navigation und Aktivierung/Deaktivierung der zwei untergeordneten Bildschirme orchestrieren lassen.

public AppViewModel : Conductor<Screen> 
{ 
    public void AppViewModel() 
    { 
     ActivateItem(new FirstViewModel()); 
    } 

    public void ActivateSecondViewModel() 
    { 
     // FirstViewModel will automatically be deactivated 
     // and closed since we are using plain Conductor<T> 
     ActivateItem(new SecondViewModel()); 
    } 
} 
+0

Hallo, ich habe viele Bildschirme mit Tasten, also ziehe ich es vor, sie rufen den nächsten Bildschirm auf. Ich bearbeitet AppViewModel zu Dirigent und immer noch nicht funktioniert :( –

0

Ich habe es gefunden! Das Verknüpfungsereignis wurde an das Fenster und nicht an die Benutzersteuerung angehängt. Also Ereignis, wenn Benutzersteuerung beendet wurde, das Ereignis noch an das Fenster "angefügt". Jetzt habe ich eine Methode hinzugefügt, die aufgerufen wird, wenn UserControl entladen ist, um das Ereignis zu "lösen". Schlechter Fehler!

Verwandte Themen