2010-10-06 58 views
1

嗨,我試圖理解如何直接發送消息到speciciel目標。我得到了一個小型的SL projet和一個叫做class1的dunmmy類。我在類構造函數中註冊並偵聽所有字符串類型的消息。MVVM-Light:使用TTarget的信使

public class Class1 
{ 
    public Class1() 
    { 
     Messenger.Defaut.Register<String>(this, f => { TraiteMessage(f); }); 
    } 

    public void TraiteMessage(string sMessage) 
    { 
     MessageBox.Show("Class1:" + sMessage); 
    } 
} 

現在我發送消息是這樣的:

Messenger.Defaut.Send<String, Class1>("test message");

消息沒有達到目標。當我查看MVVM燈的內部源代碼時,我可以看到測試完成了:item.Action.Target.GetType()== messageTargetType,但實際上messageTargetType設置爲:MyProejet.Class1,但是項目。 Action.Target.GetType()返回類似:{System.Collections.Generic.Dictionary 2System.Type,System.Collections.Generic.List 1 SLDuninLib.Messages.Avise + WeakActionAndToken]} {的System.Type} System.RuntimeType

我該怎麼辦錯了嗎? 感謝您的幫助

回答

0

是否在任何地方創建了Class1的實例?如果沒有,那麼它從不註冊接收任何消息。

您可以通過在註冊爲在Class1構造函數中接收消息的代碼行上放置一個斷點來輕鬆地進行測試。

我測試你的代碼,當我在另一個視圖模型消息登記,但是這是因爲在ViewModelLocator任何視圖模型只要App.xaml中加載創建它的工作原理。

+0

是的,class1在MainPage.xaml.ca載入事件中是instanciate。用於測試目的。 – Pierre 2010-10-08 13:17:29

0

當TTarget定義時,消息被其類型所識別,而不是實例。 因此,您的代碼沒有工作(如您所遇到的),因爲您發送的消息類型爲Class1類型,但您註冊的收件人爲字符串類型,而非Class1類型。

因此,在這種情況下,可以考慮幾種解決方案。

  • 製作Class1的靜態和手柄收到的消息如下:

Messenger.Defaut.Register<Class1>(this, msg => { Class1.TraiteMessage(msg); });

  • 或者,在字符串類型相同的註冊類型發送消息。

Messenger.Defaut.Send<String, String>("test message");

  • 或者,定義了一個小的結構,其包含要如下它們之間傳輸變量。

public struct SearchTerm { public string Category; public string Keyword; }

發送如下:

Messenger.Default.Send(new SearchTerm{Category = "Q",Keyword = "something"}));

和消耗到Class如下:

Messenger.Default.Register<SearchTerm>(this,msg => {TraiteMessage(msg.Keyword);});

對我來說,最後的解決方案是首選。

乾杯