当使用来自外部的var时,MvvmLight Messenger不会触发

问题描述 投票:0回答:1

我有一个简单的消息发送者(“记录存储”),它发送消息:

public class RecordStoreUpdatedMessage
{
    public BaseModel Model { get; set; }

    public RecordStoreUpdatedMessage(BaseModel model)
    {
        Model = model;
    }
}

// somewhere in RecordStore:
var item = new BaseModel();
Messenger.Default.Send(new RecordStoreUpdatedMessage(item));

然后我有一个接收器,它记录了这个消息的回调:

Messenger.Default.Register<RecordStoreUpdatedMessage>(this, msg => {
                Debug.WriteLine("DataTreeItemViewModel: cought RecordStoreUpdatedMessage");
                //Debug.WriteLine("and the current item is " + anything);
});

直到那里一切都很好,Debug.WriteLine触发,我可以通过'msg'从RecordStoreUpdateMassage获取所有内容。

一旦我在接收器的回调中引入并使用本地var(无论如何),Debug.WriteLines就不再触发了(我需要本地var来检查更新的记录是否真的影响了我,或者我是否可以忽略它):

string anything = "Test";
Messenger.Default.Register<RecordStoreUpdatedMessage>(this, msg => {
                Debug.WriteLine("DataTreeItemViewModel: cought RecordStoreUpdatedMessage");
                Debug.WriteLine("and the current item is " + anything);
});

结果:没有。没有错误,没有Debug.WriteLine。

版本: mvvmLight 5.4.1.1 .Net 4.6.1 也许相关:发送者和接收者生活在2个不同的项目/集会中

我研究了几个问题,如Strange behavior with actions, local variables and garbage collection in MVVM light Messengermvvmlight messenger strange behaviour,但没有找到一个解决使用局部变量的微小差异的问题。

差点忘了问一个具体的问题......: 为什么使用本地var阻碍Messenger发起回调?如何才能在回调中使用本地var?

c# mvvm-light
1个回答
0
投票

我找到了解决方案:

使回调不是lambda,而是对方法的引用就可以了:

// in Constructor
Messenger.Default.Register<JeffData.Messages.RecordStoreUpdatedMessage>(this, UpdateItem);

private void UpdateItem(JeffData.Messages.RecordStoreUpdatedMessage recordStoreUpdatedMessage)
{
    // here I can use ModelType now (a property of this class)
    if (recordStoreUpdatedMessage.Model.GetType() == ModelType && recordStoreUpdatedMessage.Model.Id == Model.Id)
    {
        Debug.WriteLine("DataTreeItemViewModel: cought RecordStoreUpdatedMessage with item: " + recordStoreUpdatedMessage.Model.GetType().ToString());
        Model = recordStoreUpdatedMessage.Model;
    }
}

仍然:我可以理解,由于范围和GC问题,本地var不能用于回调。但是根本不会触发回调很奇怪......如果不是错误的话。

© www.soinside.com 2019 - 2024. All rights reserved.