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