#mvvm-light
#mvvm-light
Вопрос:
Пожалуйста, помогите.. Я пытаюсь использовать класс messenger для перекрестного просмотра сообщений, в частности, я хочу перенаправить все ошибки (исключения) в главное представление, где я могу открыть приятный пользовательский интерфейс с ошибкой и некоторыми предложениями, что делать.
У меня есть статический класс в общем проекте со всеми типами сообщений моих приложений в виде перечисления. (уменьшено до единицы в примере ниже)
public static class AppMessages
{
enum MessageTypes
{
RaiseError
}
public static class RaiseErrorMessage
{
public static void Send(Exception ex)
{
Messenger.Default.Send(ex, MessageTypes.RaiseError);
}
public static void Register(object recipient, Action<Exception> action)
{
Messenger.Default.Register(recipient, MessageTypes.RaiseError, action);
}
}
}
Например, для регистрации я вызываю статический метод в статическом классе в том же общем проекте..
AppMesssages.RaiseErrorMessage.Register(this,OnRaiseErrorMessage);
Для отправки я использую …
AppMessages.RaiseErrorMessage.Send(e);
Теперь проблема, с которой я сталкиваюсь, заключается в том, что если я не изменю эти токены на одно и то же значение, скажем, «1», я не получаю сообщение, но я не могу понять, почему использование enum не работает?
Итак, чтобы было ясно, я получаю сообщение только в том случае, если использую…
public static class RaiseErrorMessage
{
public static void Send(Exception ex)
{
Messenger.Default.Send(ex, 1);
}
public static void Register(object recipient, Action<Exception> action)
{
Messenger.Default.Register(recipient, 1, action);
}
}
Я просто продолжаю смотреть на код, и теперь у меня замораживание мозга, скажите мне, что я делаю не так. Большое спасибо за любые ответы.
Ответ №1:
@user1014297, я реализовал аналогичное решение с использованием Enum, и оно работает. Это может быть проблема с потоками и / или то, что экземпляр, который используется для регистрации получателя, выходит за рамки.
Мое решение использует MEF, а также MVVM Light, я отправляю исключения из различных модулей MEF в приложение запуска MEF. Все исключения отображаются с использованием единого пользовательского интерфейса. Я упростил приведенный ниже код для иллюстрации
Регистрация:
public static bool _handleErrorUIRegistered;
private static void _registerExceptionHandlerUI(object instance)
{
if (_handleErrorUIRegistered) return;
_handleErrorUIRegistered = true;
Messenger.Default.Register<Exception>(
instance,
Sym.SL.Shared.Enums.Dialogs.Error,
ex =>
{
// Do something
GalaSoft.MvvmLight.Threading.DispatcherHelper.UIDispatcher.BeginInvoke(() =>
{
MessageBox.Show("Showing the error: rnrn" ex.Message);
});
});
}
Отправка сообщения:
Messenger.Default.Send<Exception>(new Exception("Test Error"), Sym.SL.Shared.Enums.Dialogs.Error);