MvvmLight Messenger не запускается при использовании var извне - PullRequest
0 голосов
/ 24 марта 2019

У меня есть простой отправитель сообщения («RecordStore»), который отправляет это сообщение:

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, я могу получить все из RecordStoreUpdateMassage через 'msg'.

НО

как только я введу и использую локальный 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 разных проектах / сборках

Я изучил несколько вопросов, таких как Странное поведение с действиями, локальными переменными и сборкой мусора в MVVM light Messenger и mvvmlight Messenger странное поведение , но не нашел такой, который адресовал бы эта крошечная разница использования локального var.

Почти забыл задать конкретный вопрос ...:
Почему использование локального var мешает Messenger запускать обратный вызов? Что я могу сделать, чтобы иметь возможность использовать локальную переменную в обратном вызове?

1 Ответ

0 голосов
/ 24 марта 2019

Я нашел решение:

Выполнение обратного вызова не лямбда, но ссылка на метод сделал трюк:

// 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;
    }
}

Тем не менее: я мог понять, что локальная переменная не может использоваться в обратном вызове из-за проблем с областью действия и сборкой мусора. Но вообще не вызывать обратный вызов ... если не ошибка.

...