嘿傢伙, 我正在使用Silverlight和MVVM模式構建項目,我需要做的是,導航到一個頁面,其中有一個視圖模型作爲LayoutRoot的DataContext,我需要將對象傳遞給該視圖模型進行編輯,但由於它尚未構建,我將無法使用MVVM Light Messenger類,因爲爲了發送消息,您需要註冊首先指定類型。發送消息給MVVM輕Silverlight中的未構造類
因此,有可能在構建視圖模型類之前發送消息,並且在構建視圖模型類時可以獲取消息?
嘿傢伙, 我正在使用Silverlight和MVVM模式構建項目,我需要做的是,導航到一個頁面,其中有一個視圖模型作爲LayoutRoot的DataContext,我需要將對象傳遞給該視圖模型進行編輯,但由於它尚未構建,我將無法使用MVVM Light Messenger類,因爲爲了發送消息,您需要註冊首先指定類型。發送消息給MVVM輕Silverlight中的未構造類
因此,有可能在構建視圖模型類之前發送消息,並且在構建視圖模型類時可以獲取消息?
我沒有嘗試過自己,但this guy似乎有一個很好的解決了這個通病。您可以通過在WP7Contrib.Messaging文件夾下查看實現它的單個cs文件來查看源代碼(無需下載整個contrib項目)here。該項目作爲一個整體用於移動應用程序(特別是WP7),但這種自定義Messenger實現與此無關。
基本上,他製作了一個特殊的Messenger實現,在每次有人註冊時都會重新發布給定類型簽名的最後一條消息。這樣,第一個虛擬機可以發送它的消息,第二個虛擬機將會創建(可能是通過你的IoC容器或其他任何東西)並註冊來監聽,並立即獲得發送之前發送的消息。
當然,這可能會有一些與種族條件有關的問題。它依賴於沒有其他消息被髮送給給定的簽名,直到目標收件人有機會接收它。但在實踐中,我認爲這不是一個太大的問題。特別是如果您充分利用消息的目標和發件人部分。
我看了網站,看起來好像會起作用,所以我會把這個標記爲答案,但我將不得不稍後再嘗試。 – Peymankh 2011-04-21 07:06:50
應該在設置根視覺之前創建所有視圖模型。
設置斷點
MainViewModel()是先出手。
Sub3ViewModel()被擊中,聽者註冊。
RootVisual設置。
我不知道爲什麼這是投下來的,我一定沒有理解這個問題。我想我不清楚在視圖導航之前不允許你在虛擬機中註冊監聽器的事件順序。幾天前我做了一個類似於此的演示。 https://bitbucket.org/dbeattie/navdemo/src – 2011-03-15 03:55:07
每個視圖模型將在頁面導航時創建。 – Peymankh 2011-03-15 11:41:01
如果你看看我提到的例子,在ViewModelLocator的構造函數的ViewModelLocator中爲CreateMain()設置一個斷點。您也可以在MainViewModel的構造函數中設置一個。正如你所看到的,MainViewModel是在MainView被設置爲RootVisual之前創建的。 Sub1ViewModel是在Sub1View導航到之前構建的。所以,你可以在視圖導航到之前在構造函數中註冊一個監聽器。 – 2011-03-15 13:55:56
我不認爲你可以發送消息給一個永遠不會創建的對象..我認爲你應該嘗試使用一些會話字典,並設置一個ViewModel的值,然後在另一個View上瀏覽時讀取值。 – 2011-03-02 14:14:42
你是對的,你不能發送消息到尚未創建的東西,所以讓我們來回答這個問題。我的新實例化對象怎樣才能接收之前爲它設計的消息?如果您願意的話,它可以檢查創建的一種消息語音郵件。看到我的答案下面這種解決方案。 – 2011-04-20 16:56:06
這正是我正在尋找的,所以我需要檢查出來。 – Peymankh 2011-04-21 06:52:45