2011-09-16 174 views
1

我正在使用MVVMLight並通過一點學習曲線來嘗試和計算通信如何工作。我理解Properties如何與Silverlight綁定一起工作,這非常簡單。通過MVVMLight發送命令

現在我想知道的是發送消息作爲命令的最佳方法是什麼。因此,例如,我想發送一條消息到我的ViewModel來清除它的列表。

所以我可以創建一個枚舉充當命令

enum MessageOp 
{ 
    Reset 
} 

但我怎麼能發送此作爲一個命令?目前我將它作爲課程發送,但之後需要再次發送它作爲令牌。像這樣:

Messenger.Default.Send<MessageOp>(MessageOp.Reset, MessageOp.Reset); 

與我的視圖模型代碼是這樣的:我想到的是創建一個完全空類作爲一個命令的

Messenger.Default.Register<MessageOp>(
    this, MessageOp.Reset, 
    delegate(MessageOp op) 
    { 
     // Erase all entries 
     MyDictionary.Clear(); 
    }); 

的一種方式。這是最好的辦法,因爲我覺得有點奇怪創建空的類來這樣做

+0

答案符合您的需求嗎? – AxelEckenberger

回答

5

不太確定你想達到什麼,但我想你想從一個視圖發送消息到另一個。在這種情況下,您使用

Messenger.Send(Message.Reset); 

發送消息。在收件方使用下面的代碼:

Messenger.Register<MessageOp>(this, (m) => { 
    if (m == MessageOp.Reset) { 
     // your code 
    } 
}); 

非常重要:如果您使用的消息,一定要通過Messenger刪除收件人。在視圖模型的情況下,可以通過在視圖模型上調用清理來完成。在所有其他情況下使用Messenger.Unregister(收件人)。這是必要的,因爲MVVM Light中的弱行爲實現具有釋放收件人的已知問題。

但是,如果您只是想將一個按鈕(或類似的東西)綁定到某個命令上,則可以使用一個RelayCommand。

添加以下定義您的視圖模型:

public RelayCommand ResetCommand { 
    get { 
     return _resetCommand ?? (_resetCommand = new RelayCommand(
      () => { 
       // your execution code 
      }, 
      () => { 
       // can execute - gets called quite often! 
      ) 
     )); 
    } 
} 
private RelayCommand _resetCommand; 

然後你可以命令綁定到一個按鈕

<button Content="Reset" Command="{Binding ResetCommand}"/> 

編輯

將消息發送到特定的收件人,確實有兩種可能性:

  1. 發送消息時添加令牌。
  2. 創建只有收件人訂閱的自定義消息。

就我個人而言,我會採用第二種方法,因爲它更清晰明確 - 因此更易於維護。所以,去創造你可以做以下的自定義消息:

public class OperationMessage : GenericMessage<MessageOp> { 
    public OperationMessage(MessageOp operation) : base(operation) { } 
} 

public class ResetMessage : OperationMessage 
{ 
    public ResetMessage() : base(MessageOp.Reset) { } 
} 

現在,您可以發送

Messenger.Send(new ResetMessage()); 

和接收

Messenger.Register<ResetMessage>(this, (m) => { 
    // do your resetting here 
}); 

Messenger.Register<OperationMessage>(this, true, (m) => { 
    // handle all operations here - the operation is avaiable via m.Content 
}); 

原因爲什麼我要創建OperationMessage是它是mo靈活,並且可以根據需要通用或特定地處理操作。

+0

這不是我正在尋找的東西,而是有用的信息。我想要的是發送一條消息,並確保它達到了特定的目標。想想更多,我想我可以使用字符串目標與我想要接收的名稱然後註冊該令牌。如'Messenger.Default.Send (MessageOp.Reset,「PeopleViewModel」);'一件小事,應該在什麼時候應該清理一次?這是在破壞者還是其他點? – Firedragon

+0

@Firedragon請參閱編輯...希望這可以解決您的問題。更具體的你的OP會幫助... ;-) – AxelEckenberger

+0

感謝您的更新。對不起,如果我不夠具體。試圖用不完全解釋我在工作中做什麼的方式來提出問題證明是一個挑戰:-)最後一件事,你是否介意在Cleanup需要完成的階段進行一點說明(顯然, t存在,我去了所有C++一會兒) – Firedragon