2014-12-02 59 views
1

我有一個MainWindow,它由幾個UserControls組成。如何爲WPF中的每個用戶控件分別創建視圖模型

目前,我有一個上帝ViewModel.cs這是定義在MainWindow級別,併爲所有的用戶控件做的工作。

現在我覺得這不是正確的做法。也許我應該爲每個用戶控件分別提供不同的視圖模型,對吧?但我的問題是如何在這些之間進行交互?假設有一些事件發生在usercontrol1這改變了usercontrol2的viewmodel?

+3

TextBox是否有虛擬機? ListView是否有虛擬機?網格是否有虛擬機? *那麼UserControl爲什麼要有一個虛擬機?*這是一種代碼味道。它聞起來像你嘗試這樣做時遇到的失敗。只需在您的UserControl上創建公共屬性,將這些屬性綁定到您的虛擬機,然後在您的UC xaml中綁定到這些屬性。或者做任何你需要在代碼隱藏中做的UI邏輯。 – Will 2014-12-02 18:44:48

+0

@ Will Will Will,你的意思是我應該將公共屬性以雙向模式綁定到VM? – Vahid 2014-12-02 19:09:32

+0

您的UserControls表面上的公共DependencyProperties。從內部綁定他們,從外面綁定他們。把它們儘可能地綁在一起。出發!並綁定! – Will 2014-12-02 19:15:30

回答

2

對此沒有確切的答案,這取決於具體情況。但是,針對不同情況的一些建議如下:

  1. 如果用戶控件只是簡單數據的奇特顯示,它們可能不需要視圖模型。所需的屬性可以通過依賴屬性公開,並綁定到主視圖模型。

  2. 如果用戶控件很大(並且您使用的頁面更像頁面),那麼它們大多是獨立的,所以交互不是問題。如果他們需要修改一些全局狀態,那麼他們可能會爲了這樣做,以更新其他視圖模型

  3. 如果有很多互動,那麼你可能沒有正確封裝您的用戶控件。一般來說,我會嘗試解決這個問題,如果我不能,將共享數據放在主視圖模型中,並將該對象傳遞給子視圖模型,以便他們可以訪問它。

您還需要小心的用戶控制視圖模型,如果你設置控件的DataContext屬性,你希望你從主控制用戶控件綁定將無法工作。一個簡單的解決方法是對子視圖模型使用根UIElementDataContext

+0

感謝布拉德利,實際上我目前已將主窗口的DataContext設置爲其所有子用戶控件,並且工作正常。其中一個用戶控件非常大,但不是獨立的,我想我必須堅持這個架構,直到我擴展了我對MVVM的知識。 – Vahid 2014-12-02 19:12:54

1

您應該使用事件來控制視圖模型之間的交互。使用常規的.NET事件的問題在於它將視圖模型耦合在一起,因爲它們對彼此具有明確的瞭解。

爲了解決這個問題,你可以使用一個現有的MVVM框架來提供一個'事件代理',也就是說,一個視圖模型可以訂閱的機制,並且發佈事件而不必瞭解彼此。 MVVM框架

例子是PRISM,卡利微型,輕型MVVM等

你也可以推出自己的事件代理,但可能更好地與現有的去,除非你有一個很好的理由不這樣做。

相關問題