2012-01-20 40 views
0

我是MVVM光照世界的新手,搜索后我找不到我想要做的事情。使用mvvm-light将对象发送到VIewModel

我的WP7应用程序包含一个数据透视表,每个数据透视项的内容是View1,viewmodel是VM1。

加载我的应用程序时,我想创建具有相同视图和视图模型但具有不同参数的每个数据透视表项目。

例如:

PivotItem 1 - >发送参数“车”向视图模型 PivotItem 2 - >发送参数“卡车”向视图模型等

谷歌告诉我使用短信但是如果我从我的MainViewModel发送2条消息,则PivotItem1和PivotItem2 ViewModel都会收到这些消息。

我对这种方法有错吗? 是否有另一种成功的解决方案?

非常感谢您的回答。

PS:放纵,英语不是我的母语,不要犹豫,要求进一步的信息。

问候,

艾默里克拉奇尔

回答

0

要单独的消息使用第二个构造函数签名,让你可以传递一个令牌。这个令牌可以是任何东西,但我通常使用枚举来存储系统中的所有消息类型。 在公共库中创建一个静态类,并在需要发送或接收消息的所有项目中引用该静态类。

下面的代码希望显示这种方法,注意我发送一个字符串作为消息中的值,但这可以是任何东西,甚至是一个复杂的对象,如您的业务对象之一。

namespace MyProject.Common 
{ 
    public static class AppMessages 
    { 
     enum MessageTypes 
     { 
      ViewmodelA, 
      ViewmodelB 
     } 

     public static class ViewModelAUpdate 
     { 
      public static void Send(string value) 
      { 
       Messenger.Default.Send(value, MessageTypes.ViewmodelA); 
      } 

      public static void Register(object recipient, Action<string> action) 
      { 
       Messenger.Default.Register(recipient, MessageTypes.ViewmodelA, action); 
      } 
     } 

     public static class ViewModelBUpdate 
     { 
      public static void Send(string value) 
      { 
       Messenger.Default.Send(value, MessageTypes.ViewmodelB); 
      } 

      public static void Register(object recipient, Action<string> action) 
      { 
       Messenger.Default.Register(recipient, MessageTypes.ViewmodelB, action); 
      } 
     } 
    } 
} 
+0

谢谢你的回答,但你的解决方案只适用于我们有2个视图模型类。这里我有一个ViewModel类,但是这个VM有两个实例。如果我喜欢你说的话,两个VM都会收到2个更新。 –

+0

当您使用Messenger注册时,您注册的实例不是类型... – Andy

+0

如何使用方法来设置您想要接收的消息。 (这可以作为构造函数或属性中的参数) – Andy

0

如何使用一种方法来设置要接收的消息。 (这可以作为构造函数中的参数或属性来完成)

public void RegisterForAppMessage(AppMessages.MessageTypes messageType) 
    { 
     switch (messageType) 
     { 
      case AppMessages.MessageTypes.PivotViewItem1Message: 
       AppMessages.PivotViewItem1Message.Register(this,DoSomethingWhenIRecievePivotViewItem1Messages) 
      break; 
      case AppMessages.MessageTypes.PivotViewItem2Message: 
       AppMessages.PivotViewItem2Message.Register(this,DoSomethingWhenIRecievePivotViewItem2Messages) 
      break; 
     } 
    } 

    private void DoSomethingWhenIRecievePivotViewItem2Messages(string obj) 
    { 
     // TODO: Implement this method 
     throw new NotImplementedException(); 
    } 

    private void DoSomethingWhenIRecievePivotViewItem1Messages(string obj) 
    { 
     // TODO: Implement this method 
     throw new NotImplementedException(); 
    } 
0

消息听起来有点沉重,为此目的。你可以简单地向你的ViewModel注入一个参数。如果你已经有MVVMLight,你也可以支持SimpleIOC。也许让视图在视图解析时找到它的ViewModel,并决定在视图模型上使用哪个参数? 你可以看到它的一个例子here

相关问题