序言
做項目是提升個人能力最快的方式。
為什么要使用Prism框架?
Prism的出現正是出於構建一個:可重復利用的、可擴展的、靈活的、可以團隊開發的、高質量的應用程序提供了一個很好的解決方案。
Prism框架中一些非常重要的概念
1、Prism思想是模塊化編程,我將主界面拆分為四個模塊(A、B、C、D)。
2、模塊之間不能互相引用,也就是解耦了。
MVVM
說起這個MVVM模型,就不得不說MVC框架。
將整個前端頁面分成View,Controller,Modal,視圖上發生變化,通過Controller(控件)將響應傳入到Model(數據源),由數據源改變View上面的數據。
整個過程看起來是行雲流水,業務邏輯放在Model當中,頁面渲染邏輯放在View當中,但在實際運用上卻存在一個問題:那就是MVC框架允許View和Model直接進行通信!!
換句話說,View和Model之間隨着業務量的不斷龐大,會出現蜘蛛網一樣難以處理的依賴關系,完全背離了開發所應該遵循的“開放封閉原則”。
MVVM(Model–View–Viewmodel)是一種軟件架構模式。
簡單的講,MVVM是MVC的改進版。我們都知道MVC軟件架構模式是蘋果推薦的開發模式。
MVC中的M就是單純的從網絡獲取回來的數據模型,V指的我們的視圖界面,而C就是我們的ViewController。
在其中,ViewController負責View和Model之間調度,View發生交互事件會通過target-action或者delegate方式回調給ViewController,與此同時ViewController還要承擔把Model通過KVO、Notification方式傳來的數據傳輸給View用於展示的責任。隨着業務越來越復雜,視圖交互越復雜,導致Controller越來越臃腫,負重前行。臟活累活都它干了,到頭來還一點不討好。福報修多了的結果就是,不行了就重構你,重構不了就換掉你。
來一張斯坦福老頭經典的MVC架構圖。
所以為了解決這個問題,MVVM就閃亮登場了。他把View和Contrller都放在了View層(相當於把Controller一部分邏輯抽離了出來),Model層依然是服務端返回的數據模型。而ViewModel充當了一個UI適配器的角色,也就是說View中每個UI元素都應該在ViewModel找到與之對應的屬性。除此之外,從Controller抽離出來的與UI有關的邏輯都放在了ViewModel中,這樣就減輕了Controller的負擔。
我簡單的畫了下MVVM的架構圖。
概念
private DataGridViewModel ViewModel => DataContext as DataGridViewModel;
Mode=OneWay
1.OneTime:一次綁定,在綁定創建時使用源數據更新目標,適用於只顯示數據而不進行數據的更新。
2.OneWay:單向綁定,在綁定創建時或者源數據發生變化時更新到目標,適用於顯示變化的數據。
3.TwoWay:雙向綁定,在任何時候都可以同時更新源數據和目標。
public virtual void OnNavigatedTo(NavigatedToEventArgs e, Dictionary<string, object> viewModelState);
public virtual void OnNavigatingFrom(NavigatingFromEventArgs e, Dictionary<string, object> viewModelState, bool suspending);
使用Microsoft.Practices.Unity 依賴注入
豆瓣小組
Prism 簡介
Prism 6.3,其中 WPF 平台的項目有這么多個:
- Prism.Wpf
- Prism.Autofac
- Prism.DryIoc
- Prism.Mef
- Prism.Ninject
- Prism.StructureMap
- Prism.Unity
相比 Prism 6.3,剛剛發布的 8.0 已經好很多了(雖然還是有很多個項目),例如 WPF 平台的項目已經大幅刪減,只保留了 Prism.Wpf、Prism.DryIoc 和 Prism.Unity,也就是說現在 Prism 只支持 DryIoc 和 Unity 兩種 IOC 容器。這樣一來 Prism 項目的結構就很清晰了。
以 WPF 為例,核心的項目是 Prism.Core,它提供實現 MVVM 模式的核心功能以及部分各平台公用的類。然后是 Prism.Wpf,它提供針對 Wpf 平台的功能,包括導航、彈框等。最后由 Prism.Unity 指定 Unity 作為 IOC 容器。
資料
https://www.jianshu.com/p/0ae3c0d830e5
https://github.com/PrismLibrary/Prism
https://www.cnblogs.com/dino623/p/using_prism_core.html