ObservableRecipient
이 ObservableRecipient
형식은 메시지의 받는 사람 역할을 하는 관찰 가능한 개체의 기본 클래스입니다. 이 클래스는 형식을 사용하기 IMessenger
위한 기본 제공 지원도 제공하는 확장 ObservableObject
입니다.
플랫폼 API:, ,
IMessenger
ObservableObject
,WeakReferenceMessenger
,IRecipient<TMessage>
ObservableRecipient
PropertyChangedMessage<T>
작동 방식
이 ObservableRecipient
형식은 기본 제공 지원을 제공하므로 기능을 사용하는 IMessenger
viewmodel의 기반으로 사용됩니다. 특히 다음 사항에 주의하십시오.
- 매개 변수가 없는 생성자와 인스턴스를
IMessenger
사용하는 생성자가 모두 종속성 주입과 함께 사용됩니다. 또한 viewmodel에서Messenger
메시지를 보내고 받는 데 사용할 수 있는 속성을 노출합니다. 매개 변수가 없는 생성자를 사용하는 경우 인스턴스가WeakReferenceMessenger.Default
속성에Messenger
할당됩니다. - viewmodel을
IsActive
활성화/비활성화하는 속성을 노출합니다. 이 컨텍스트에서 "활성화"는 지정된 viewmodel이 사용 중인 것으로 표시됨을 의미합니다. 예를 들면 다음과 같습니다. 등록된 메시지 수신 대기를 시작하고, 다른 설정 작업을 수행하는 등의 작업을 수행합니다. 속성 값이 변경될 때 호출되는 두 가지 관련 메서드OnActivated
와OnDeactivated
이 메서드가 있습니다. 기본적으로OnDeactivated
등록된 모든 메시지에서 현재 인스턴스의 등록을 자동으로 취소합니다. 최상의 결과를 위해 메모리 누수 방지를 위해 메시지에 등록하고 클린up 작업을 수행하는 데 사용하는OnDeactivated
것이 좋습니다OnActivated
. 이 패턴을 사용하면 viewmodel을 여러 번 사용/사용하지 않도록 설정할 수 있지만 비활성화될 때마다 메모리 누수 위험 없이 안전하게 수집할 수 있습니다. 기본적으로 인터페이스를OnActivated
통해IRecipient<TMessage>
정의된 모든 메시지 처리기를 자동으로 등록합니다. - 속성에서 사용할 수 있는 인스턴스를
PropertyChangedMessage<T>
통해IMessenger
메시지를 보내는 메서드를 노출Broadcast<T>(T, T, string)
합니다Messenger
. 사용할 인스턴스를 수동으로 검색Messenger
하지 않고도 viewmodel 속성의 변경 내용을 쉽게 브로드캐스트하는 데 사용할 수 있습니다. 이 메서드는 메시지를 보낼지 여부를 나타내는 추가bool broadcast
속성이 있는 다양한SetProperty
메서드의 오버로드에서 사용됩니다.
다음은 활성 상태일 때 메시지를 수신 LoggedInUserRequestMessage
하는 viewmodel의 예입니다.
public class MyViewModel : ObservableRecipient, IRecipient<LoggedInUserRequestMessage>
{
public void Receive(LoggedInUserRequestMessage message)
{
// Handle the message here
}
}
위의 OnActivated
예제에서는 해당 메서드를 호출하는 작업으로 사용하여 인스턴스를 메시지의 받는 사람으로 LoggedInUserRequestMessage
자동으로 등록합니다. 인터페이스를 IRecipient<TMessage>
사용하는 것은 필수가 아니며, 인라인 람다 식만 사용하는 경우에도 등록을 수동으로 수행할 수 있습니다.
public class MyViewModel : ObservableRecipient
{
protected override void OnActivated()
{
// Using a method group...
Messenger.Register<MyViewModel, LoggedInUserRequestMessage>(this, (r, m) => r.Receive(m));
// ...or a lambda expression
Messenger.Register<MyViewModel, LoggedInUserRequestMessage>(this, (r, m) =>
{
// Handle the message here
});
}
private void Receive(LoggedInUserRequestMessage message)
{
// Handle the message here
}
}
예제
- 샘플 앱(여러 UI 프레임워크의 경우)을 확인하여 작동 중인 MVVM 도구 키트를 확인합니다.
- 단위 테스트에서 더 많은 예제를 찾을 수도 있습니다.
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
MVVM Toolkit