我的项目中有异常行为。我使用MvvmLight Messenger通知用户界面的不同部分进行更新。

   public EntryViewModel(MenuViewModel menuVM, Entry item)
    {
        this._menuVM = menuVM;
        OpenDetailsCommand = new RelayCommand(OpenDetailsInMainWindow);
        BackCommand = new RelayCommand(Back);

        this._entry = item;
        Refresh();

        Messenger.Default.Register<CardUpdateMessage>(this, this._entry.Id, msg => Refresh(); );
 }

并发送
Messenger.Default.Send(new CardUpdateMessage(id), id);

当我在注册后看到Messenger内容时,其中包含大约400个CardUpdateMessage的已注册操作,但是当我致电send时,均不会触发。
顺便说一句,每个消息类型具有单个注册对象的类似代码可以按我的预期工作。这个问题是什么原因造成的?

更新:我对调试器进行了一些研究,发现在文件https://mvvmlight.codeplex.com/SourceControl/latest#GalaSoft.MvvmLight/GalaSoft.MvvmLight(PCL)/Messaging/Messenger.cs中,已触发SendToList方法,并且在其内部循环中触发了WeakAction,但未运行Refresh方法。我对WeakAction没怀疑吗?

解决方案:我发现了此问题。由于意外行为,不允许在Messenger.Register中使用匿名功能。
只是Messenger.Default.Register(this, this._entry.Id, Refresh);private void Refresh(CardUpdateMessage msg) ...
外部引用:https://mvvmlight.codeplex.com/workitem/7640

最佳答案

这是答案https://mvvmlight.codeplex.com/workitem/7640,这是
Strange behavior with actions, local variables and garbage collection in MVVM light Messenger

简而言之,解决方案-请勿在Messenger.Default.Register中使用lambda,因为它们的行为可能不符合您的预期。

关于c# - mvvmlight Messenger的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39911423/

10-11 18:00