Регистрация для сообщений вне ViewModel в MVVM Light? - PullRequest
2 голосов
/ 08 октября 2011

Я пытался зарегистрировать сообщение вне ViewModel в статическом конструкторе, но, очевидно, что регистрация не выполнялась: зарегистрированное действие никогда не выполнялось при отправке сообщений.Я попытался передать пустой или новый объект для параметра recipient при регистрации, но это не сработало.

У меня такое ощущение, что указание получателя должно быть как-то важно, но я не знаю почему,Я думал, что все получатели должны были получать передаваемые сообщения в любом случае.Есть ли способ заставить это работать или это просто не поддерживается?

Ответы [ 2 ]

1 голос
/ 09 октября 2011

Получатель важен, когда вы используете Messenger.Register для Messenger.Send, это не важно.Тем не менее, существует известная ошибка в реализации WeakReference WeakAction в MVVM, которая содержит ссылку на получателя, хотя и должна ее устранить.

Короче говоря, если вы находитесь внутри ViewModel, убедитесь, что вы вызываете Cleanup.В представлении вызовите Messenger.Unregister(this) в событии Unloaded, например

public MyView() {
    this.Unloaded += (o, e) => { Messenger.Unregister(this); }
}

В других классах вам придется либо внедрить IDisposable, либо использовать какой-либо другой механизм для отмены регистрации получателя сообщения.

См. Также:

0 голосов
/ 08 октября 2011

Неважно, я вошел в исходный код и выяснил, что происходит.Он добавляет получателя в качестве WeakReference, чтобы выяснить, жив он или нет.Я просто передавал new object() в качестве получателя, и он не стрелял, потому что думал, что мой получатель мертв.

...