Уведомление о просмотре (модели) закрытия программы
-
10-10-2019 - |
Вопрос
Поэтому я получил свою программу PRISM/MVVM/MEF хорошо, пользователь вводит данные в приложении, а затем закрывает приложение (или закрывает компьютер).
Как я могу получить свое представление (модель) уведомлена о закрытии программы / выключении компьютера, чтобы он мог либо сохранить данные пользователей, либо, может быть, спросить, следует ли их сохранить?
Потеря данных о закрытии программы, безусловно, следует избегать, и не имеет смысла сохранять вещи на каждом ключевом потоке пользователя.
Решение
Я выставляю CompositeCommands, которые клиенты могут зарегистрироваться для интересных глобальных "событий", например,
public static class HostCommands
{
private static readonly CompositeCommand Shutdown = new CompositeCommand();
public static CompositeCommand ShutdownCommand
{
get { return Shutdown; }
}
}
Я запускаю команду выключения в своей оболочке, например,
public Shell()
{
InitializeComponent();
Closing += (sender, e) =>
{
if (HostCommands.ShutdownCommand.CanExecute(e))
HostCommands.ShutdownCommand.Execute(e);
};
}
И клиенты могут зарегистрироваться следующим образом, например
public SomeViewModel(IEventAggregator eventService)
{
//blah, blah, blah...
HostCommands.ShutdownCommand.
RegisterCommand(new DelegateCommand<object>(_ => Save()));
}
Обновлять
Я не обращаюсь к сценарию отмены, но вы можете реализовать это через объект, который передается в команду. Например, в приведенном выше коде я прохожу в CanceleVentargs, которые клиенты могли манипулировать IE, установив DeclEl = true. Я мог бы осмотреть это значение в моем обработчике с закрытым событием Shell после того, как команда выполнила, чтобы получить, должен ли я отменить закрытие оболочки. Этот шаблон может быть расширен.