5
因此,我得到了我的棱鏡/ mvvm/mef程序運行良好,用戶在應用程序中輸入數據,然後關閉應用程序(或關閉計算機)。通知查看(模型)關閉程序
如何讓我的View(Model)通知程序關閉/計算機關閉,以便它可以保存用戶數據或者詢問是否應該保存這些數據?
程序關閉丟失數據絕對是要避免的,並且在用戶的每個按鍵上保存內容都沒有意義。
因此,我得到了我的棱鏡/ mvvm/mef程序運行良好,用戶在應用程序中輸入數據,然後關閉應用程序(或關閉計算機)。通知查看(模型)關閉程序
如何讓我的View(Model)通知程序關閉/計算機關閉,以便它可以保存用戶數據或者詢問是否應該保存這些數據?
程序關閉丟失數據絕對是要避免的,並且在用戶的每個按鍵上保存內容都沒有意義。
我公開了CompositeCommands,客戶端可以註冊爲感興趣的全局「事件」,例如,
public static class HostCommands
{
private static readonly CompositeCommand Shutdown = new CompositeCommand();
public static CompositeCommand ShutdownCommand
{
get { return Shutdown; }
}
}
我在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()));
}
更新
我不辦理取消的情況,但你可以通過它傳遞給對象實現這個命令。例如在上面的代碼中,我傳遞了一個CancelEventArgs,客戶端可以通過設置Cancel = true來操作。在命令執行後,我可以在Shell關閉事件處理程序中檢查此值是否應取消關閉shell。這種模式可以擴展。
很酷,看起來不錯!只是想知道:在SomeViewModel中你寫了「新命令(_ => Save())」 - 不應該是「new DelegateCommand(()=> Save())」? – Sam 2010-12-16 13:13:51
@Sam你說得很對。我從DelegatedCommand繼承。我將更新示例,以便僅使用Prism類型。 – 2010-12-16 13:20:29
哦,我不知道使用棱鏡事件(鬆散耦合事件)是否會更好,所以我不需要擔心解除綁定? – Sam 2010-12-16 14:11:36