2015-10-28 61 views
0

我目前正在創建一個「嚮導」來在我的程序中創建新項目。我有一個即將完成的解決方案,但它不覺得「正確」,並開始考慮其他解決方案。也許應該注意我也使用MVVMLight。在wpf中創建嚮導

我目前的解決方案:

  • 我有一個窗口和窗口包含自定義用戶控件(它們所代表的嚮導的每一頁)。

  • 無論是窗口和用戶控件共享同一個視圖模型

  • 當您單擊後退/下一個視圖模型處理,應該是可見

的問題,這其中一個用戶控件我不喜歡共享視圖模型。我有一個共享視圖模型,因爲所有頁面在同一個對象上配置不同的東西,並且更容易遵循。但同時,視圖模型包含了很多單個用戶控件不需要的東西(例如,只有一個頁面需要添加/編輯過濾器的方法)。如果我想讓它們用於除嚮導以外的其他功能,也很難在以後重新使用用戶控件。

那麼我應該爲窗口和每個用戶控件創建不同的視圖模型,並使用MVVMLights MessengerInstance在視圖模型之間發送消息?我覺得這樣更清潔,但作爲一個讀者,它可能很難遵循(當我發送消息的時候,我總體感覺到的一些東西)?

與Messenger的它會是這樣一個流程:

  1. 用戶輸入「頁」
  2. 用戶點擊上的所有信息下一個(屬於窗口)
  3. 窗戶查看模型必須向用戶控件發送消息以檢查所有數據是否有效
  4. 用戶控件檢查數據,如果數據有效,則必須發回。如果有效,則告訴下一頁可見,如果不顯示錯誤消息。

因此,我不需要使用共享視圖模型解決方案來回傳輸大量消息。

還是有更好的解決方案,我應該做的?

+0

我看不出與共享視圖模型的一個問題。您可以爲單個用戶控件的視圖模型定義單獨的界面。然後,您的具體視圖模型實現所有這些模型,並使視圖與視圖模型解耦。 –

回答

0

我期望你在這裏得到的答案主要是基於意見的,但是無論如何這裏都是這樣。

目前,您的視圖模型有多個責任,因此,有多個原因需要更改。將視圖模型分成更小,更易於管理的類是一個好主意。這可能會降低可讀性,但我不同意。確保類只有一個責任保持簡單並促進重用的想法。

話雖這麼說,你主要視圖模型將最有可能持有引用許多其他孩子視圖模型,但是這並不是世界末日,其實,這是一個很好的事情。視圖模型之間的父子關係非常類似於視圖中的父子關係。例如,Window包含許多UserControls,模仿與視圖模型之間的關係沒有任何問題。

現在,在視圖模型之間進行通信當然有幾種方法。我個人更喜歡使用事件,其中子視圖模型引發父視圖模型訂閱的事件。很簡單,真的。雖然在這種情況下一定程度的耦合,你當然可以抽象你的類擄到接口和使用依賴注入將其注入到父視圖模型。使用事件取決於個人偏好,但是MVVMLight具有相當不錯的MessengerInstance,可以進一步分離視圖模型。

所以。我的建議:

  • 計算您的視圖模型的職責
  • 將海量視圖模型分解爲小視圖模型(基於責任)。
  • 在視圖模型之間創建父子關係。事實上,你的觀點將指出你在關係方面的正確方向。