Использование Messenger с перечисленным токеном не работает должным образом - PullRequest
0 голосов
/ 26 октября 2011

Пожалуйста, помогите .. Я пытаюсь использовать класс мессенджера для перекрестного просмотра сообщений, в частности, я хочу направить все ошибки (исключения) через главное окно, где я могу открыть приятный интерфейс с ошибкой и некоторыми предложениямичто делать.

У меня есть статический класс в общем проекте со всеми типами сообщений приложений в качестве перечисления.(сокращено до единицы в приведенном ниже примере)

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 Ответ

0 голосов
/ 07 ноября 2011

@ 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: + \r\n\r\n" + ex.Message);
                });
            });
    }

Отправка сообщения:

Messenger.Default.Send<Exception>(new Exception("Test Error"), Sym.SL.Shared.Enums.Dialogs.Error);
...