2011-09-16 176 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