使用带有枚举令牌的Messenger似乎无法按预期工作

时间:2011-10-26 10:43:22

标签: 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”我没有收到消息,但是我无法看到我的生活为什么使用枚举不工作?

所以要明确的是,如果我使用的话,我只收到消息......

    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 :(得分:0)

@ user1014297,我使用Enum实现了一个类似的解决方案,它的工作原理。它可能是一个线程问题和/或用于注册接收器的实例超出了范围。

我的解决方案使用MEF和MVVM Light,我将各种MEF模块的异常发送到MEF启动应用程序。使用单个UI显示所有异常。为简化说明,我简化了以下代码

注册:

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