2013-07-21 37 views
1

從我的閱讀中,MVVM的優點之一是它提供了分離。這很棒,但有時您的視圖可能需要了解周圍環境,例如在處理狀態時。改變MVVM中其他視圖的狀態

在我的項目中,我的一個視圖激活了一些後臺任務,結果實時顯示在屏幕上。問題是,如果我要點擊我的文件 - >新建,我將能夠改變視圖。這在後臺任務正在運行時不可取。

現在,我可以想辦法解決這個問題,但它似乎違背了MVVM方法(對於這個項目,即使它沒有意義,我也想使用它(給我更好地理解模式的優勢/劣勢))。

因此,假設我的項目是使用MainWindow(具有上下文菜單和ContentControl顯示我的視圖)和單個視圖構建的。我可以看到做這項工作的唯一方法是將我的MainWindow實例傳遞給View的ViewModel(或者也可以使用委託也可以)。然後,我可以控制菜單的可見性狀態等...這似乎是一個糟糕的設計選擇,因爲我必須爲每個視圖(更多的工作)都做到這一點,而且我的系統現在非常緊密地結合在一起。

我認爲這一定是一個流行的問題,但我找不到任何建議的方法。

在我的腦海中,有一個名爲StateControllingClass或類似的額外文件將是一個很好的答案,但是當我們實例化它們以共享相同的對象時,仍然需要將它作爲參數傳遞給所有ViewModel?

無論如何,我的問題是;有沒有更好的方法使用標準的MVVM方法(意思是不使用MVVM框架)?

+0

您可以在視圖模型中添加一些狀態 - 特定於用戶界面 - 視圖可以綁定到/觀察。所以當你在視圖模型中改變這個新的狀態時,所有的界限/觀察視圖都會更新? – TooTone

回答

2

我想你應該看看Event Aggregator模式。主要思想是在事件聚合器中註冊的所有視圖模型。如果發生什麼事情,您可以將事件發佈到聚合器。聚合器將事件傳遞給所有感興趣的視圖模型。所以你可以很容易地保持你的應用程序的固態。
你可以在Jeremy Miller blogpost中看到更多,並看看這個implemented in Caliburn.Micro框架。

+0

謝謝,我現在就開始閱讀! – Dave

1

較小的部分應該不知道整體。所以ViewModel不應該知道啓動它的主Windows。

而後臺任務應該不知道啓動它的ViewModel。它應該有一個取消方法,由啓動它的ViewModel調用。然後

視圖模型可以用這個方法來取消它運行的任何任務時,收到樣的一些取消命令

和主菜單的視圖模型可以發送該取消命令到活動視圖模型時,文件/新命令被菜單觸發

+0

嗯,我不認爲這回答了這個問題,但它是一個好主意和一個很好的解決方法!所以+1 – Dave

相關問題