Отправка общих сообщений

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

public class Foo1
: Foo<Telephone>
{
}

public class Foo2
: Foo<Home>
{   
}

Как отправить Foo1 в Foo2? Я понимаю, что сообщение типизировано, и, следовательно, сообщения одного и того же типа получены, но мне нужно сообщение между производными классами...

Пример был бы очень признателен.


person codeputer    schedule 26.05.2011    source источник


Ответы (2)


обмен сообщениями в 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);
        }

и да, это нарушает предложение в моем первом предложении, но теоретически у меня может быть несколько виртуальных машин или просмотр, прослушивающий сообщения об исключениях.

Может быть, еще один пример, чтобы помочь вам... я ненавижу всю эту фигню... это всегда меня смущает...

Это в моем основном модуле:

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) { }
    }

вот как я использовал это в своей виртуальной машине:

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");
        }
person ecathell    schedule 27.05.2011
comment
Я отметил это как ответ, так как хотел увидеть способ решения моей проблемы, и я никогда не видел примера GenericMessage. Тем не менее, я не думаю, что это решило бы мою проблему. В моем примере Foo1 и Foo2 на самом деле являются двумя разными типами, поскольку типы определяются во время компиляции (а не во время выполнения). Я знаю это, но не думал об этом, когда я застрял на этой проблеме (слишком много часов за клавиатурой, я думаю!) Как я решил свою проблему через интерфейс, извлеченный из базового класса. Сообщение, созданное с использованием Интерфейса — предоставление общего интерфейса для всех. - person codeputer; 27.05.2011

Альтернативой является создание собственного класса, содержащего полезную нагрузку, которую вы хотите доставить (Foo1 или просто object). Затем в Foo2 зарегистрируйтесь, чтобы получать сообщения типа класса, который вы только что создали.

Эта ссылка объясняет, как с очень простым для понимания примером.

Суп из MVVM Light Toolkit Soup To Nuts 3 — Джесси Либерти

person Vincenzo Piscitelli    schedule 27.05.2011