C# MVVM指示灯-收到多次消息

C# MVVM指示灯-收到多次消息,c#,wpf,mvvm,mvvm-light,C#,Wpf,Mvvm,Mvvm Light,首先,英语不是我的母语,所以如果有错误,我道歉 我遇到了MVVM Light messenger的messenger问题。 即使我注销了messenger,它似乎也会触发几次。有很多关于这个的帖子,但似乎没有什么能解决我的问题 所有my viewModel都是由ViewModelLocator创建的单例,只有ViewModels使用Messenger 我使用带有标记的注册方法,即viewModelName,以及ProcessMessage方法来处理消息。每个ViewModel都以相同的方式在构造

首先,英语不是我的母语,所以如果有错误,我道歉

我遇到了MVVM Light messenger的messenger问题。 即使我注销了messenger,它似乎也会触发几次。有很多关于这个的帖子,但似乎没有什么能解决我的问题

所有my viewModel都是由
ViewModelLocator
创建的单例,只有
ViewModels
使用Messenger

我使用带有标记的注册方法,即
viewModelName
,以及
ProcessMessage
方法来处理消息。每个
ViewModel
都以相同的方式在构造函数中注册,并且都有不同的名称:

Messenger.Default.Register<SimpleMessage>(this, ViewModelName, ProcessMessage);
收件人收到消息,但在收到2或3条消息后,会多次触发该消息,并且每次收到消息的次数都会增加

我尝试在使用后销毁并重新创建ViewModel,但没有成功。调用sendMessage方法2或3次后,将多次收到该消息。我也尝试过这个方法,但还是没有达到预期效果:

    public static void UnRegisterViewModel<T>(T instance) where T : ViewModelTemplate
    {
        Messenger.Default.Unregister<SimpleMessage>(instance, instance.ViewModelName);
        instance.Cleanup();
        SimpleIoc.Default.Unregister<T>();
        SimpleIoc.Default.Register<T>(true);
    }
publicstaticvoid取消注册ViewModel(T实例),其中T:ViewModelTemplate
{
Messenger.Default.Unregister(instance,instance.ViewModelName);
Cleanup();
SimpleIoc.Default.Unregister();
SimpleIoc.Default.Register(true);
}
我已经在Messenger.Default类中看到,有一个私有字段“\u recipientStrictAction”,用于存储收件人。 当它多次触发时,列表中确实存在多次相同的令牌


有人能解释我做错了什么吗?

显而易见的解释是你订阅了好几次。在viewmodel的一个实例中有多个,或者在viewmodel的多个实例中各有一个。所有viewmodel都是单例的。每次销毁时我都会注册,然后重新创建viewModel:我先注销Messenger的收件人,然后再从SimpleIOC注销它。然后我在SimpleIOC中注册新实例,最后在Messenger中注册(在构造函数中)。取消注册的方法应该。。。注销…请您在方法的开头设置一个断点
UnRegisterViewModel
,并计算它被调用的频率,以验证@Andy的建议吗?@Rene Carannante我已经测试过了。这方面没有问题。必要时会调用该方法。显而易见的解释是您订阅了多次。在viewmodel的一个实例中有多个,或者在viewmodel的多个实例中各有一个。所有viewmodel都是单例的。每次销毁时我都会注册,然后重新创建viewModel:我先注销Messenger的收件人,然后再从SimpleIOC注销它。然后我在SimpleIOC中注册新实例,最后在Messenger中注册(在构造函数中)。取消注册的方法应该。。。注销…请您在方法的开头设置一个断点
UnRegisterViewModel
,并计算它被调用的频率,以验证@Andy的建议吗?@Rene Carannante我已经测试过了。这方面没有问题。必要时调用该方法。
    public static void UnRegisterViewModel<T>(T instance) where T : ViewModelTemplate
    {
        Messenger.Default.Unregister<SimpleMessage>(instance, instance.ViewModelName);
        instance.Cleanup();
        SimpleIoc.Default.Unregister<T>();
        SimpleIoc.Default.Register<T>(true);
    }