2013-08-06 83 views
6

有人能爲我解釋MVVM Light的Messenger嗎?我在這裏閱讀StackOverflow的一篇文章:MVVM pass values between view models試圖得到這個。有關MVVM Light的文檔在這一點上並不太好,所以我完全不確定要去哪裏。使用MVVM Light的Messenger在視圖模型之間傳遞值

說我有兩個ViewModels和一個ViewModelLocator。我希望能夠在所有三個之間傳遞參數而沒有問題。我該如何去使用這個使者去做這件事?它有能力嗎?

編輯:這是我的新實現。截至目前,它看起來好像MessengerInstance不會調用令牌。我非常困惑。

在第一個視圖模型:

MessengerInstance.Send<XDocument>(SelectedDocument); 

而在第二個:

MessengerInstance.Register<XDocument>(this, xdoc => CopySettings(xdoc)); 

可能是完全錯誤的。沒有機會去測試它,但是當我這樣做時,視覺工作室對我不那麼生氣。 MessengerInstance也在發送消息之前進行註冊。

+0

「,但視覺工作室得到與少生氣當我這樣做時「。哈。這讓我輕笑。 :) –

回答

12

說我有兩個ViewModel和一個ViewModelLocator。我希望能夠在所有三個之間傳遞參數而沒有問題。我該如何去使用這個使者去做這件事?它有能力嗎?

這正是它的目的,是的。

要發送消息:

MessengerInstance.Send(payload, token); 

要收到一條消息:

MessengerInstance.Register<PayloadType>(
    this, token, payload => SomeAction(payload)); 

有許多重載,所以不知道你想通過信使來完成什麼,我贏了沒有進入所有這些,但上面應該涵蓋想要發送和接收具有有效載荷的消息的簡單情況。

請注意,「令牌」實際上可以是標識消息的任何內容。雖然字符串經常被用於此,我更喜歡,因爲它是一個小更安全,更使智能感知到使用枚舉,「查找用法」等

例如:

public enum MessengerToken 
{ 
    BrushChanged, 
    WidthChanged, 
    HeightChanged 
} 

然後您發送/接收會是這樣的:

// sending view model 
MessengerInstance.Send(Brushes.Red, MessengerToken.BrushChanged); 

// receiving view model 

// put this line in the constructor 
MessengerInstance.Register<Brush>(this, token, brush => ChangeColor(brush)); 

public void ChangeColor(Brush brush) 
{ 
    Brush = brush; 
} 

[編輯]以下網址devuxer的評論改爲: http://blog.galasoft.ch/posts/2009/09/mvvm-light-toolkit-messenger-v2/

+0

這是完美的!我試過在這方面搜索文檔,但沒有發現。你知道我可能錯過的任何文件嗎?我幾乎沒有看到MVVM Light。 – DanteTheEgregore

+0

開發MVVM Light的人,Laurent Bugnion傾向於使用他的博客介紹新功能或功能更新。以下是您可能會發現有用的信使的特定條目:http://blog.galasoft.ch/lbugnion/archive/2009/09/27/mvvm-light-toolkit-messenger-v2-beta。aspx – devuxer

+0

我一直在外科手術,直到今天都沒有機會開始實施。我看不到MessengerInstance在哪裏調用令牌。我會將我的實現添加到主帖子中。我也在這裏發佈了另一個問題:http://stackoverflow.com/questions/18241290/mvvm-light-messenger-not-functioning-as-expected/18241995?noredirect=1#18241995 – DanteTheEgregore

相關問題