2010-12-16 23 views
5

Así que obtuve mi programa prism/mvvm/mef ejecutándose muy bien, el usuario está ingresando datos en la aplicación, luego cierra la aplicación (o apaga la computadora).notificar View (Modelos) de cerrar el programa

¿Cómo puedo avisar a mi View (Modelo) del cierre del programa/cierre de la computadora, para que pueda guardar los datos de los usuarios o quizás pregunte si deberían guardarse?

Perder datos en el cierre del programa definitivamente es algo que debe evitarse, y no tiene sentido guardar cosas en cada pulsación de tecla del usuario.

Respuesta

8

Expongo CompositeCommands que los clientes pueden registrarse para interesantes "eventos" globales, p.

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

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

Active el comando shutdown en mi shell, p.

public Shell() 
{ 
    InitializeComponent(); 

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

Y los clientes pueden registrarse de la siguiente manera, por ejemplo

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

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

actualización

Yo no manejo el escenario cancelar, pero se puede aplicar esto a través del objeto que se pasa a la mando. Por ejemplo, en el código anterior, paso un CancelEventArgs que los clientes podrían manipular, es decir, configurando Cancelar = verdadero. Podría inspeccionar este valor en mi controlador de evento cerrado de Shell después de que el comando se haya ejecutado para deducir si debo cancelar el cierre del shell. Este patrón se puede expandir.

+0

Genial, se ve genial! Solo me pregunto: en SomeViewModel escribió "new Command (_ => Save())" - ¿no debería ser esto "nuevo DelegateCommand ((= = Guardar())"? – Sam

+1

@Sam tienes razón. He heredado de DelegatedCommand. Actualizaré la muestra para que solo use tipos de Prism. –

+0

Ah, y me pregunto si sería mejor usar el prisma de eventos (eventos débilmente acoplados), así que no tengo que preocuparme por la desvinculación. – Sam

Cuestiones relacionadas