发送通用消息

时间:2011-05-26 02:41:05

标签: mvvm-light

public class Foo<T> where T: Entity
{}

public class Foo1
: Foo<Telephone>
{
}

public class Foo2
: Foo<Home>
{   
}

如何将Foo1发送到Foo2?我意识到消息是键入的,因此收到相同类型的消息 - 但我需要在派生类之间发送消息...

非常感谢一个例子。

2 个答案:

答案 0 :(得分:2)

另一种方法是创建自己的类,其中包含您要传递的有效负载(Foo1或简称object)。然后在Foo2中,注册以接收刚刚创建的类类型的消息。

此链接解释了如何使用一个非常容易理解的示例。

MVVM Light Toolkit Soup To Nuts 3 - Jesse Liberty

答案 1 :(得分:1)

理论上,mvvmlight中的消息传递被认为是火灾而忘记...发送者并不关心谁获取消息而接收者并不关心谁发送消息,只要它正在侦听它的正确类型。 我已经通过大量的试验和错误发现它比使用mvvm-light提供的默认值更容易制作自己的消息,它们是一个很好的起点,但有时你会发现自己跳过了箍..

public class ExceptionMessage : GalaSoft.MvvmLight.Messaging.GenericMessage<System.Exception>
    {
        public ExceptionMessage(System.Exception content) : base(content) { }
        public ExceptionMessage(object sender, System.Exception content) : base(sender, content) { }
        public ExceptionMessage(object sender, object target, System.Exception content) : base(sender, target, content) { }
    }

收件人代码:

Messenger.Default.Register<Core.Messaging.ExceptionMessage>(this, ex => ShowExceptionMessage(ex));

发件人代码:

public void LogException(Exception content)
        {
            _messenger.Send<Core.Messaging.ExceptionMessage>(new ExceptionMessage(content));
            //GetBw().RunWorkerAsync(content);
            WriteToDatabaseLog(content);
        }

并且这确实打破了我的第一句中的建议,但理论上我可以有几个vms或查看侦听异常消息。

也许另一个例子来帮助你...我讨厌整个foo的事情......它总是让我困惑......

这是我的核心模块:

public class SaveNotification<T> : GalaSoft.MvvmLight.Messaging.NotificationMessage<T> where T : GalaSoft.MvvmLight.ViewModelBase
    {
        public SaveNotification(T content, string notification) : base(content, notification) { }
        public SaveNotification(object sender, T content, string notification) : base(sender, content, notification) { }
        public SaveNotification(object sender, object target, T content, string notification) : base(sender, target, content, notification) { }
    }

这是我在我的vm中使用它的方式:

public void OnSubmitChanges(SubmitOperation so)
        {
            if (so.HasError)
            {
                Infrastructure.GetService<IExceptionLoggingInterface>().LogException(this, so.Error);
            }
            else
            {
                //Save Responses
                _messenger.Send<Messages.NavigationRequest<SubClasses.URI.PageURI>>(GetNavRequest_HOME());
                ClearQuestionaire(true);
                _messenger.Send<WavelengthIS.Core.Messaging.SaveNotification<QuestionairreViewModel>>(GetSuccessfulSaveNotification());

            }

            Wait.End();
        }

        private WavelengthIS.Core.Messaging.SaveNotification<QuestionairreViewModel> GetSuccessfulSaveNotification()
        {
            return new WavelengthIS.Core.Messaging.SaveNotification<QuestionairreViewModel>(this, "Save Successfull");
        }