通知关闭程序的视图(模型)

Sam*_*Sam 5 prism shutdown mvvm application-shutdown

所以我让我的prism/mvvm/mef程序运行良好,用户在应用程序中输入数据,然后关闭应用程序(或关闭计算机).

如何通知程序关闭/计算机关闭的View(模型),以便它可以保存用户数据,也可以询问是否应保存这些数据?

关闭程序关闭的数据肯定是要避免的,并且在用户的每个按键上保存内容是没有意义的.

Tim*_*oyd 8

我公开了客户可以注册的有趣全局"事件"的CompositeCommands,例如

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

    public static CompositeCommand ShutdownCommand
    {
        get { return Shutdown; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在shell中触发shutdown命令,例如

public Shell()
{
    InitializeComponent();

    Closing += (sender, e) =>
    {
        if (HostCommands.ShutdownCommand.CanExecute(e))
            HostCommands.ShutdownCommand.Execute(e);
    };
}
Run Code Online (Sandbox Code Playgroud)

客户可以注册如下,例如

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

    HostCommands.ShutdownCommand.
        RegisterCommand(new DelegateCommand<object>(_ => Save()));
}
Run Code Online (Sandbox Code Playgroud)

更新

我不处理取消方案,但您可以通过传递给命令的对象来实现.例如,在上面的代码中,我传入一个客户可以操作的CancelEventArgs,即设置Cancel = true.在命令执行后我可以在我的Shell关闭事件处理程序中检查此值,以获取是否应该取消关闭shell.可以扩展此模式.

  • 根据经验,我建议使用命令路由.命令保证在应用程序关闭之前执行所有操作 - 必须调用具有处理程序的所有内容.事件根据事物的订阅方式引入多线程问题,因此您可以进入竞争条件,其中处理程序仍在处理应用程序本身已终止时的关闭逻辑.不是一个好地方. (2认同)