我有一个简单的消息发送者(“记录存储”),它发送消息:
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 Messenger和mvvmlight messenger strange behaviour,但没有找到一个解决使用局部变量的微小差异的问题。
差点忘了问一个具体的问题......: 为什么使用本地var阻碍Messenger发起回调?如何才能在回调中使用本地var?
我找到了解决方案:
使回调不是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不能用于回调。但是根本不会触发回调很奇怪......如果不是错误的话。