2010-05-31 52 views
2

我正在使用MVVM Light Toolkit。我無法找到任何Ctor of Messenger或Notification類發送空信息。使用MVVM工具包指示燈發送空的消息或通知

ViewModel1:

private int _selectedWeeklyRotation; 
    public int SelectedWeeklyRotation 
    { 
     get { return _selectedWeeklyRotation; } 
     set 
     { 
      if(_selectedWeeklyRotation == value) 
       return; 

      _selectedWeeklyRotation = value; 
      this.OnPropertyChanged("SelectedWeeklyRotation"); 
      if(value > 1) 
       Messenger.Default.Send();      
     } 
    } 

ViewModel2:

Ctor: 

Messenger.Default.Register(this, CreateAnotherTimeTable); 

private void CreateAnotherTimeTable() 
{ 

} 

我只需要發送通知到另一個視圖模型,沒有發送數據都沒有。

MVVM Light Toolkit庫可以嗎?

+0

誰是洛朗? – 2010-05-31 20:25:04

+0

erhm ...在這裏提供他的服務的工具包的作者? – msfanboy 2010-05-31 20:45:38

回答

0

我不認爲這是可能的,坦率地說,我沒有看到有這種信息的觀點。你可以發送一個字符串「SelectedWeeklyRotation」。當您增加應用程序中廣播消息和接收器的數量時,有一條空的消息具有某種含義似乎很奇怪。

在我使用的MVVM Light版本中,甚至無法發送空信息。

但是我沒有看到ViewModelBase的方法是:

// Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging 
RaisePropertyChanged(MyPropertyPropertyName, oldValue, value, true); 

這可能是你的興趣。

+0

@karinp 看起來很有趣,您是否找到了該方法的任何樣本?我無法找到任何有關該事件使用情況的信息/示例項目。 – msfanboy 2010-06-05 18:36:03

1

真的沒有辦法做到這一點,並在某些方面蔑視信使類的重點。我不想寫一個你做錯了的帖子,但我覺得我卡住了。信使類的工作方式是你有兩個訂閱同一個概念的團體,它是一個觀察者模型。如果沒有類似的概念或信息,那麼確實沒有辦法將兩個對象聯繫在一起。無論簡單字符串還是自定義消息充當訂閱和發佈類的會議點的通用消息。

如果視圖模型出版知道視圖模型的類型,它試圖發送到它可以...

Messenger.Default.Send<Type>(typeof(ViewModelToSendTo); 

這將作爲一個非常簡單的交互點,你也不必創建一個自定義類。一些純粹主義者可能會對這種方法產生問題,因爲它將發佈類與訂閱者結合在一起。

2

除非我誤解了某些東西,難道你不能通過使用Messenger創建和發送自定義的「信號消息」類型來實現這一點嗎?

public class WeeklyRotationSignal {} 

Messenger.Default.Send(new WeeklyRotationSignal()); 

然後註冊到另一個視圖模式:

Messenger.Default.Register<WeeklyRotationSignal>(this, msg => doWork); 
2

您可以嘗試發送一個簡單的消息字符串變量和字符串變量匹配收到消息。是這樣的:位於可能在類似ViewModel1.cs

Messenger.Default.Send<string>("Dummy text message", "String_ToHelpMatchTheMsg"); 

接收響應於該消息上面的代碼的端部,可能位於其他一些文件,像ViewModel2代碼

發件人部.cs
...

Messenger.Default.Register<string>(this, "String_ToHelpMatchTheMsg", executeThisFunction); 

private void executeThisFunction(string strMsg) 
{ 
    //your code would go here to run upon receiving the message 
    // The following line will display: "Dummy text message" 
    System.Windows.Browser.HtmlPage.Window.Alert("msg passed: " + strMsg); 
} 

請注意,您不必對使用上述消息代碼傳遞的文本消息進行任何操作。只是代碼的一部分發送一些ping到代碼的另一部分來請求其他部分執行一些代碼。重要的字符串是我使用「String_ToHelpMatchTheMsg」的地方,因爲這是用來匹配發送者和接收者的關鍵字。幾乎就像創建自己的準事件一樣,一旦Send方法運行,Register方法就會被通知並激發自己的函數來運行。

我在一個子窗口上用關閉按鈕來關閉它。 「子視圖」窗口上的「關閉」按鈕綁定到其childWindowViewModel上的中繼命令。該中繼命令具有上述代碼以向ParentViewModel發送消息。 ParentViewModel中的Register部分通過觸發一個方法來響應該消息,該方法關閉最初從該parentViewModel中初始化的ChildWindow。

一旦你更熟悉的消息,也有更多的屬性,你將能夠使用,使得接收機可以回撥發送給狀況,或者一些數據回來。尋找Delegates和lambda函數來實現這一點。

所有這些都是爲了避免在後面的代碼中放置代碼來關閉子窗口! :-) 按照您認爲合適的方式使用。

乾杯。 馬里奧