2010-12-16 71 views
5

因此,我得到了我的棱鏡/ mvvm/mef程序運行良好,用戶在應用程序中輸入數據,然後關閉應用程序(或關閉計算機)。通知查看(模型)關閉程序

如何讓我的View(Model)通知程序關閉/計算機關閉,以便它可以保存用戶數據或者詢問是否應該保存這些數據?

程序關閉丟失數據絕對是要避免的,並且在用戶的每個按鍵上保存內容都沒有意義。

回答

8

我公開了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。這種模式可以擴展。

+0

很酷,看起來不錯!只是想知道:在SomeViewModel中你寫了「新命令(_ => Save())」 - 不應該是「new DelegateCommand(()=> Save())」? – Sam 2010-12-16 13:13:51

+1

@Sam你說得很對。我從DelegatedCommand繼承。我將更新示例,以便僅使用Prism類型。 – 2010-12-16 13:20:29

+0

哦,我不知道使用棱鏡事件(鬆散耦合事件)是否會更好,所以我不需要擔心解除綁定? – Sam 2010-12-16 14:11:36