Использование Messenger с перечисленным токеном, похоже, работает не так, как ожидалось

#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);