2011-10-08 2 views
2

정적 생성자에서 ViewModel 외부에 메시지를 등록하려고했지만 등록이 필요하지 않은 것 같습니다. 등록 된 작업은 메시지를 보낼 때 실행되지 않았습니다. 등록 할 때 recipient 매개 변수에 null 또는 새 객체를 전달하려고 시도했지만 작동하지 않았습니다.MVVM Light에서 ViewModel 외부의 메시지에 등록 하시겠습니까?

수령인이 어떻게 든 중요해야한다고 지정하는 느낌이 들지만, 나는 이유를 모른다. 나는 모든 수신자가 어쨌든 방송 된 메시지를 받도록되어 있다고 생각했습니다. 이 작업을 수행 할 수있는 방법이 있습니까? 아니면 단순히 지원되지 않는 것입니까?

답변

1

Messenger.RegisterMessenger.Send으로 사용할 때는받는 사람이 중요합니다. 중요하지 않습니다. 그러나 수신자에 대한 참조를 보유하고있는 MVVM에서 WeakReference 구현에 버그가 알려진 알려진 버그가 있지만이를 릴리스해야합니다.

ViewModel 내부에 있다면 간단히 Cleanup으로 전화하십시오. 보기의 경우 Messenger.Unregister(this)으로 전화하십시오 (예 : Unloaded). 다른 클래스에서

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

IDisposable를 구현하거나 메시지받는 사람의 등록을 취소하는 다른 메커니즘을 사용하거나해야합니다.

은 참조 :

+0

받는 사람에 대한 참조를 보유하고 WeakReference를 버그가있다? 클래스의 전체 * 포인트는 객체가 가비지 수집되는 것을 방지하는 강력한 참조를 보유하지 않는 것이라고 생각했습니다. – RandomEngy

+0

예, 로랑 (Laurent)이 알고 있습니다. 문제는 메서드 처리기로 전달하는 메서드와 관련이 있습니다. 이 메소드는 약할 수 없으므로 오브젝트가 가비지 수집되지 않습니다. WeakReference가 객체 자체를 추적하는 경우에만 작동합니다. 이것에 대한 해결책은 사소하지 않습니다. http://mvvmlight.codeplex.com/discussions/235068을 참조하십시오. – AxelEckenberger

+0

오, WeakReference 클래스 자체에 버그가 있다는 것을 알고 있다고 생각했는데 놀라운 일이었습니다. – RandomEngy

0

Nevermind, 나는 소스 코드에 들어가서 무슨 일이 일어나고 있는지 알아 냈습니다. 수신자를 WeakReference로 추가하여 그것이 살아 있는지 여부를 파악합니다. 나는 수신자로 new object()을 그냥 통과하고 있었고 수신자가 죽었다고 생각했기 때문에 발화하지 않았습니다.

관련 문제