2017-03-08 44 views
0

我正在研究將PRISM 6.2用於與Visual Studio具有相似UI的應用程序。它也將與多個文檔界面對接。我目前有一個工具欄區域和一個停靠區域。我設法使用自定義區域適配器進行一些對接工作。PRISM中的全局變量概念

我現在面臨的設計問題是如何全局共享一個對象。

我的具體情況是用戶可以從文件菜單打開'解決方案'。那麼'解決方案'需要在'解決方案資源管理器'虛擬機中,'類視圖'虛擬機中......我可以在我開始考慮打開一個新的'解決方案'時開始考慮它,然後全部應該用新解決方案更新視圖。關閉和重新創建似乎是一個糟糕的解決方案。

我想在ShellVM中有一個打開的命令,它修改停靠區域的regioncontext中的解決方案屬性。然後,每個工具項目都可以監視該屬性上的notifypropertychanged更新。或者,如果尚未打開,請在創建時使用該屬性。

但我不確定這個設置。這聽起來有點像一些「神物」。

另一種方法,我發現在這裏:https://stackoverflow.com/a/40258147/4169986

有數據的單一來源,將其提供給您的所有視圖模型作爲一種服務。

但是我並沒有把握如何在打開一個新的「解決方案」時將它與INotifyPropertyChanged結合起來。

PRISM如何做到這一點?

非常感謝提前!

+1

您可以使用共享的單身服務,您注入您的視圖模型:https://social.msdn.microsoft.com/Forums/en-US/22907a0f-d805- ?論壇= WPF 4195-8272-7c284b72d2ee /使用共享服務棱鏡示例-的- – mm8

回答

1

數據的單一來源可以爲您提供數據,而不是數據本身。想想這樣的事情:需要當前ISolution沒有得到注入,但ISolutionProvider,他們訪問通過_solutionProvider.TheCurrentSolution解決

interface ISolutionProvider : INotifiyPropertyChanged 
{ 
    ISolution TheCurrentSolution 
    { 
     get; 
    } 
} 

所有您的視圖模型。

如果有人更改當前的解決方案,ISolutionProvider會觸發PropertyChanged事件,視圖模型會注意到這些更改並將其推送到其視圖。

請注意,ISolutionProvider.TheCurrentSolution沒有setter - 這是因爲我建議將該功能放入不同的界面。該解決方案的大多數消費者將要麼閱讀解決方案,要麼閱讀關閉/打開/更改它,但不能同時解決這兩個問題。另外,從視圖模型監視ISolutionProvider.NotifyPropertyChanged時,需要確保使用弱事件(最好),或者至少在視圖模型死亡時斷開事件處理程序,因爲事件會使視圖模型保持活動狀態(造成內存泄漏)。這個小gem來這裏真的很方便...