使用mvvm-light将对象发送到VIewModel

时间:2012-01-20 08:21:33

标签: mvvm-light

我对MVVM光明世界很陌生,在搜索后我找不到我想要做的事情。

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

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

示例:

PivotItem 1 - >将param“car”发送到视图模型 PivotItem 2 - >将param“truck”发送到视图模型等

Google告诉我使用短信,但如果我从MainViewModel发送2封邮件,则PivotItem1和PivotItem2 ViewModel都会收到这些消息。

这种做法我错了吗? 还有另一种解决方案可以成功吗?

提前感谢您的回答。

PS:放纵,英语不是我的母语,请不要犹豫,要求提供更多信息。

此致

Aymeric Lagier

3 个答案:

答案 0 :(得分: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);
            }
        }
    }
}

答案 1 :(得分: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();
    }

答案 2 :(得分:0)

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