ObservableRecipient
Тип ObservableRecipient
является базовым классом для наблюдаемых объектов, которые также выступает в качестве получателей сообщений. Этот класс является расширением ObservableObject
, которое также обеспечивает встроенную поддержку использования IMessenger
типа.
API платформы:
ObservableRecipient
,ObservableObject
,IMessenger
,WeakReferenceMessenger
IRecipient<TMessage>
PropertyChangedMessage<T>
Как это работает
Тип ObservableRecipient
предназначен для использования в качестве основы для представлений, которые также используют IMessenger
функции, так как он обеспечивает встроенную поддержку. В частности:
- Он имеет как конструктор без параметров, так и тот, который принимает
IMessenger
экземпляр, для использования с внедрением зависимостей. Он также предоставляетMessenger
свойство, которое можно использовать для отправки и получения сообщений в режиме просмотра. Если используется конструктор без параметров,WeakReferenceMessenger.Default
экземпляр будет назначен свойствуMessenger
. - Он предоставляет
IsActive
свойство для активации и деактивации модели представления. В этом контексте для "активации" означает, что заданный режим представления помечается как используемый, например. он начнет прослушивать зарегистрированные сообщения, выполнять другие операции установки и т. д. Существует два связанных метода иOnActivated
OnDeactivated
вызывается при изменении значения свойства. По умолчаниюOnDeactivated
автоматически отменяет регистрацию текущего экземпляра из всех зарегистрированных сообщений. Для получения наилучших результатов и предотвращения утечки памяти рекомендуется использоватьOnActivated
для регистрации в сообщениях и дляOnDeactivated
выполнения операций очистки. Этот шаблон позволяет включить или отключить модель представления несколько раз, а безопасно собирать без риска утечки памяти при каждом отключении. По умолчанию автоматически регистрирует все обработчики сообщений,OnActivated
определенные черезIRecipient<TMessage>
интерфейс. - Он предоставляет
Broadcast<T>(T, T, string)
метод, который отправляетPropertyChangedMessage<T>
сообщение через экземпляр,IMessenger
доступный изMessenger
свойства. Это можно использовать для легкой трансляции изменений в свойствах viewmodel без необходимости вручную извлекатьMessenger
экземпляр для использования. Этот метод используется перегрузкой различныхSetProperty
методов, которые имеют дополнительноеbool broadcast
свойство, указывающее, следует ли отправлять сообщение.
Ниже приведен пример модели представления, которая получает LoggedInUserRequestMessage
сообщения при активном выполнении:
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
}
}
Примеры
- Ознакомьтесь с примером приложения (для нескольких платформ пользовательского интерфейса), чтобы просмотреть набор средств MVVM в действии.
- Дополнительные примеры можно найти в модульных тестах.
MVVM Toolkit