2015-10-23 30 views
1

我現在回到使用WPF + MVVM設計一些GUI應用程序,現在我發現它比我第一次遇到它更容易理解。C#WPF MVVM應用程序的啓動順序

然而,困擾我的一個問題是應用程序的啓動。在我看來,有兩種方法:

從主窗口視圖開始,通過一些方法實例化它的ViewModel,它再次實例化它所表示的模型。這使View/GUI處於「運行」位置。

另一種方法是重寫應用程序類的OnStartup程序(約翰。史密斯在他的The MVVM-Design Pattern MSDN Article這種方式),並通過建立模型,將它傳遞給視圖模型構造器啓動,並指定新創建的視圖模型的一個單獨創建的視圖/窗口的DataContext。

無論哪種方式都很好(在這種情況下,可能有什麼理由相對於其他方式)還是違反MVVM規則?

+1

我寫了一篇博文,從我的觀點回答你的一些問題:https://blog.rsuter.com/recommendations-best-practices-implementing-mvvm-xaml-net-applications/ –

回答

2

你的第一種方法是正確的:

從主窗口視圖

開始,有它的視圖模型通過 被實例化一些手段,再次對其進行實例表示的模型。這使 視圖/ GUI處於「操作」位置。

然後viewmodel成爲視圖的DC。 ViewModel應該有1:1的視圖。

您希望每個類都能夠儘可能少的依賴性進行實例化。

我的ViewModel ctors實際上只包含一個參數,用於根據接口傳遞包含特定於視圖的回調的類。

Model m = null; 
    IViewCallbacks cb; 
    public MainViewModel(IViewCallbacks mainViewCallbacks) 
    { 
     this.cb = mainViewCallbacks; 
     m = new Model(); 
    } 

ViewModel實例具有我需要能夠訪問的模型的實例。支持視圖的vm應該負責實例化這些,否則你的單元測試會因爲外部依賴關係(你需要通過ctor傳入的那個模型的實例)而受到影響。

+0

這很有道理。它只是覺得有點狡猾,UI應該比實例化層次中的「更高」,比BusinessLogic等。 – Xaser

+0

@Xaser我們在[WPF聊天室]中討論了這個問題(http://chat.stackoverflow.com/成績單/信息/ 264714​​42#264714​​42),並認爲有幾種方法你可以採取誠實。記下里德的評論。這並不意味着這個答案是錯的;它只是說它主要是一種偏好。 – Kcvin

+1

@NETscape感謝您的更新,非常感謝。我仔細閱讀了聊天日誌,並同意裏德的看法 - 他的解決方案看起來像喬希史密斯在他的MSDN文章中所做的 - 只是更清潔。對於我目前的項目,由於其簡單性,我會堅持Lynn的方法。 – Xaser