ObservableRecipient

ObservableRecipient 형식은 메시지의 받는 사람 역할을 하는 관찰 가능한 개체의 기본 클래스입니다. 이 클래스는 형식을 사용하기 IMessenger 위한 기본 제공 지원도 제공하는 확장 ObservableObject 입니다.

플랫폼 API:, , IMessengerObservableObject, WeakReferenceMessenger, IRecipient<TMessage>ObservableRecipientPropertyChangedMessage<T>

작동 방식

ObservableRecipient 형식은 기본 제공 지원을 제공하므로 기능을 사용하는 IMessenger viewmodel의 기반으로 사용됩니다. 특히 다음 사항에 주의하십시오.

  • 매개 변수가 없는 생성자와 인스턴스를 IMessenger 사용하는 생성자가 모두 종속성 주입과 함께 사용됩니다. 또한 viewmodel에서 Messenger 메시지를 보내고 받는 데 사용할 수 있는 속성을 노출합니다. 매개 변수가 없는 생성자를 사용하는 경우 인스턴스가 WeakReferenceMessenger.Default 속성에 Messenger 할당됩니다.
  • viewmodel을 IsActive 활성화/비활성화하는 속성을 노출합니다. 이 컨텍스트에서 "활성화"는 지정된 viewmodel이 사용 중인 것으로 표시됨을 의미합니다. 예를 들면 다음과 같습니다. 등록된 메시지 수신 대기를 시작하고, 다른 설정 작업을 수행하는 등의 작업을 수행합니다. 속성 값이 변경될 때 호출되는 두 가지 관련 메서드 OnActivatedOnDeactivated이 메서드가 있습니다. 기본적으로 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 도구 키트를 확인합니다.
  • 단위 테스트에서 더 많은 예제를 찾을 수도 있습니다.