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

Mvvm 通知视图(模型)关闭程序,mvvm,prism,shutdown,application-shutdown,Mvvm,Prism,Shutdown,Application Shutdown,因此,我的prism/mvvm/mef程序运行良好,用户在应用程序中输入数据,然后关闭应用程序(或关闭计算机) 如何让视图(模型)收到程序关闭/计算机关闭的通知,以便它可以保存用户数据,或者询问是否应该保存这些数据 在程序关闭时丢失数据肯定是需要避免的,在用户的每个按键上保存数据是没有意义的。我公开了客户端可以注册的复合命令,用于有趣的全局“事件”,例如 我在shell中触发shutdown命令,例如 public Shell() { InitializeComponent();

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

如何让视图(模型)收到程序关闭/计算机关闭的通知,以便它可以保存用户数据,或者询问是否应该保存这些数据


在程序关闭时丢失数据肯定是需要避免的,在用户的每个按键上保存数据是没有意义的。

我公开了客户端可以注册的复合命令,用于有趣的全局“事件”,例如

我在shell中触发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()));
}
public SomeViewModel(IEventAggregator事件服务)
{
//废话,废话,废话。。。
HostCommands.ShutdownCommand。
RegisterCommand(新的DelegateCommand(=>Save());
}
更新


我不处理cancel场景,但是您可以通过传递给命令的对象来实现它。例如,在上面的代码中,我传入了一个CancelEventArgs,客户端可以通过设置Cancel=true来操作它。在命令执行后,我可以在Shell closed事件处理程序中检查该值,以确定是否应该取消关闭Shell。此图案可以扩展。

很酷,看起来很棒!只是想知道:在SomeViewModel中,您编写了“new Command(=>Save())”—这不应该是“new DelegateCommand(()=>Save())”?@Sam您说得很对。我继承了委派的命令。我将更新示例,使其仅使用Prism类型。哦,我想知道使用Prism事件(松散耦合的事件)是否更好,这样我就不必担心解除绑定了?当我第一次实现它时,这似乎是一个自然选择,而且对于这个特定的使用绑定,它将持续到主机的生命周期,因此解除绑定不是一个问题。然而,使用EventAggregator似乎也是一个不错的选择。美中不足的是,严格来说,EA不应该像cancel模式所暗示的那样用于双向通信——这违反了设计意图。然而,这样做并不是世界末日。另一方面,命令支持CanExecute\Execute显式执行。根据经验,我建议使用命令路径。命令保证在关闭应用程序之前执行所有操作-必须调用具有处理程序的所有操作。事件会根据订阅方式引入多线程问题,因此您可以进入竞态条件,即当应用程序本身已经终止时,处理程序仍在执行其关闭逻辑。这不是个好地方。
public SomeViewModel(IEventAggregator eventService)
{
    //blah, blah, blah...

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