2012-11-19 38 views
0

它爲我留下誰不清楚是誰創建和配置WPF中的窗口。
正如我們所知,可以通過單擊右上角的十字標誌來關閉窗口,只有在關閉事件處理程序中設置取消= true,我們才能停止關閉。
對我來說,ViewModel決定View是否被允許關閉是很自然的。我認爲這是虛擬機如何請求適當窗口的實例化。
在我們的項目中,我們創建IViewManager誰負責MVVM模式中的Window View lifecylce?

public interface IViewManager 
{ 
    void ShowView(); 
    void CloseView(); 
} 

public interface IWindowedViewModel : IDisposable 
{ 
    bool IsEnabled {get;set;} 
    WindowState WindowState {get;set;} 
    Visibility Visibility {get;set;} 
    bool IsActive {get;set;} 

    bool CanBeClosed(); 
} 

因此,我們的虛擬機通過綁定和間接通過IViewManager的觀點交流。 在目前爲止我所見過的MVVM應用程序的例子中,VM是非常被動的,並不負責View的生命週期。這就是爲什麼我對我們的設計有些懷疑。
我不確定我們不會錯過關於MVVM模式的重要內容。

+0

如果我沒有理解你的問題,那麼我認爲View(Window/UserControl)本身就是LifeCycle的負責人。 View通過DataContext引用VM,當Window關閉時,它被Disposed,所以你的虛擬機將會被釋放。 – ethicallogics

+0

@ethicallogica但是,在邏輯禁止時,可以選擇關閉視圖(窗口):例如我們有一些未保存的更改。我們應該如何正確處理這種情況? –

回答

1

對於您將不得不修改你的窗口有bool類型Depedency物業像CanSave將被綁定到您的視圖模型(該物業會說療法是否任何未決的改變與否)。現在,如果CanSave真正你會告訴用戶一個對話框它說「你想保存掛起的更改」,如果用戶點擊火相同的命令,因爲這是你的保存按鈕,如果用戶點擊沒有只需簡單地關閉窗口。並且如果CanSavefalse只是關閉窗口。我希望這會給你一個想法。

另一種方法是使窗口關閉按鈕自定義並通過命令將其綁定到ViewModel並從中處理它。

+0

不錯。可以查看,但不是VM啓動與用戶的對話框嗎?在虛擬機中,我們可以動態地決定做什麼:顯示對話框,詢問一些服務,從而管理執行流程,如果我沒有弄錯,虛擬機負責什麼。 –

+0

我沒有看到任何問題,只要對話框打開,如果該對話框不讓用戶與相應的視圖交互。 – ethicallogics