2010-12-16 14 views
5

So bekam ich mein prism/mvvm/mef-Programm läuft gut, der Benutzer gibt Daten in der Anwendung, schließt dann die Anwendung (oder fährt den Computer herunter).benachrichtigen Ansicht (Modelle) des Schließens des Programms

Wie kann ich meine Ansicht (Modell) über das Schließen des Programms/Herunterfahren des Computers benachrichtigt werden, so dass es entweder die Benutzerdaten speichern oder fragen kann, ob diese gespeichert werden sollen?

Das Verlieren von Daten beim Schließen des Programms ist definitiv etwas, das vermieden werden sollte, und es macht keinen Sinn, Dinge bei jedem einzelnen Tastendruck des Benutzers zu speichern.

Antwort

8

Ich expose CompositeCommands, die Clients für interessante globale "Ereignisse", z.

public static class HostCommands 
{ 
    private static readonly CompositeCommand Shutdown = new CompositeCommand(); 

    public static CompositeCommand ShutdownCommand 
    { 
     get { return Shutdown; } 
    } 
} 

Ich triggert den Shutdown-Befehl in meiner Shell, z.

public Shell() 
{ 
    InitializeComponent(); 

    Closing += (sender, e) => 
    { 
     if (HostCommands.ShutdownCommand.CanExecute(e)) 
      HostCommands.ShutdownCommand.Execute(e); 
    }; 
} 

Und Kunden registrieren lassen sich wie folgt, zB

public SomeViewModel(IEventAggregator eventService) 
{ 
    //blah, blah, blah... 

    HostCommands.ShutdownCommand. 
     RegisterCommand(new DelegateCommand<object>(_ => Save())); 
} 

aktualisieren

Ich gehe nicht das Szenario zunichte machen, aber man konnte dies über das Objekt implementieren, die auf die übergeben wird Befehl. Zum Beispiel übergebe ich in dem obigen Code ein CancelEventArgs, das Clients manipulieren könnten, d. H. Durch Setzen von Cancel = true. Ich konnte diesen Wert in meinem Shell-Ereignishandler überprüfen, nachdem der Befehl ausgeführt wurde, um daraus abzuleiten, ob ich das Schließen der Shell abbrechen sollte. Dieses Muster kann erweitert werden.

+0

Cool, sieht gut aus! Ich frage mich: In SomeViewModel hast du "new Command (_ => Save())" geschrieben - sollte das nicht "new DelegateCommand (() => Save())" sein? – Sam

+1

@Sam Sie sind ganz richtig. Ich habe von DelegatedCommand geerbt. Ich werde das Beispiel aktualisieren, so dass es nur Prism-Typen verwendet. –

+0

Oh, und ich frage mich, ob es besser sein könnte, Prism Eventing (lose gekoppelte Ereignisse) zu verwenden, also muss ich mich nicht um die Entbinderung kümmern? – Sam