2017-06-19 61 views
0

我是一個初級開發誰最近買了尋找到WPF/MVVM,現在的好幾個月後,我會說我是一個像樣的WPF開發誰可以使用MVVM模式很好。現在我偶然發現了棱鏡,它吸引了我,因爲它提供了一些不錯的功能。然而,在開始一個練習應用程序來測試Prism庫之後,我使用了普通的老式WPF/MVVM,這些牆從未成爲問題。 我的主要問題親子視圖模型在WPF通信 - 棱鏡MVVM

什麼是允許使用Prism父母和孩子視圖模型之間的溝通的最佳方式?

當我說的溝通,我的意思是允許父視圖模式,如「通訊簿VM」來訪問子視圖模型,如「個人虛擬機」和它的所有屬性......因爲這是我被教導要做。我可以通過在父視圖模型中使用子視圖模型屬性,然後在視圖中簡單地使用內容控件並將其設置爲子視圖模型的datacontext來實現此目的。從這我有一個父級可以訪問childs屬性或孩子可以使用父級等命令的分層結構

但是,當使用Prism實例化視圖模型時,我使用ViewModelLocator - 這發現視圖模型爲我們實例化它。使用這種方法,沒有在父級引用視圖模型的子屬性,這意味着父級不容易訪問子級屬性,反之亦然。有沒有簡單的解決方案?

現在,如果你讀過任何聲音根本錯誤關於使用棱鏡或MVVM模式,那麼請告訴我 - 我所有的耳朵。我很有可能以不正確的方式接近一切。

+0

有什麼情況嗎?爲什麼你需要從父母和孩子那裏獲得孩子和父母的財產?它們中的每一個都可能有自己的視圖,顯示這些屬性。 – mechanic

回答

1

什麼MM8說,雖然我覺得EventAggregator是矯枉過正的那種孩子的ViewModels,你在說什麼。

在我看來,通過使用ViewModelLocator模式會讓視圖模型的實例化更加複雜,所以您不得不使用諸如EventAggregator之類的鬆散耦合解決方案來處理所有事情。 EventAggregator是一個非常棒的工具,我在我的所有項目中使用它,但是使用ViewModelLocator會迫使您使用它或類似的東西,這並不好。

如果您可以反轉項目的因果流,以便您的代碼實例化ViewModels,並使用DataTemplates提供視圖,那麼您通常會發現像這樣的問題消失,您可以簡單地實例化自己的子視圖模型並檢查以正常方式使用子viewmodel屬性。

This question解釋了爲什麼ViewModelLocator被認爲是必要的,但是因爲它有可能使用d:DesignInstance來指定設計時DataContexts對它的需求已經下降了,恕我直言。

d:DataContext="{d:DesignInstance myNamespace:MyViewModel, IsDesignTimeCreatable=True}"

+0

DataTemplate方法的缺點是您必須明確地設置一個模板,以將每個視圖模型與用戶控件相關聯。基於約定的更好,你可以繼承UserControl的子類,例如,在那裏激活ViewModelLocator,並且覆蓋VML的分辨率來定位基於命名的類型。請注意,這並不是說DataTemplates通常不會有用。 –

1

您可以使用事件聚合以鬆散耦合的方式兩種顯示模式之間進行通信。請參閱followigng博客文章有關概念的更多信息:

使用事件聚合模式視圖模式之間進行通信:https://blog.magnusmontin.net/2014/02/28/using-the-event-aggregator-pattern-to-communicate-between-view-models/

關於可棱鏡官方的GitHub網站完整代碼示例:https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/14-UsingEventAggregator

+0

感謝您的回答!我會研究這個 – rejy11