mvvm-toolkit-messenger
Faz seu agente permitir que partes de um aplicativo conversem entre si. Ele usa um sistema de mensagens para comunicação desacoplada.
O que ela faz
Este código permite que diferentes partes do seu programa se comuniquem sem se conhecerem diretamente. É como um sistema de rádio onde uma parte envia uma mensagem e outras partes interessadas a recebem.
Quando usar
- ✓Quando duas partes do programa precisam avisar uma à outra sobre algo (ex: login, mudança de tema).
- ✓Quando uma parte precisa pedir uma informação para outra e esperar uma resposta.
- ✓Para organizar a comunicação em grupos específicos, como em uma janela específica.
Exemplo do que pedir para a IA
“Me avise quando o tema escuro for ativado.”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
Ele usa um padrão chamado 'publicador/assinante'. Uma parte 'publica' uma mensagem e outras partes 'assinam' para receber essas mensagens. As mensagens podem ser enviadas com referências fracas para que não impeçam o programa de limpar a memória.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add github/awesome-copilot --skill mvvm-toolkit-messengerOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/github/awesome-copilot/main/skills/mvvm-toolkit-messenger/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
CommunityToolkit.Mvvm Messenger
Mensagens de publicação/assinatura para ViewModels (ou quaisquer objetos) sem forçar um gráfico de referência compartilhado. Parte do CommunityToolkit.Mvvm 8.x.
RESUMO. Use
WeakReferenceMessenger.Defaultpor padrão. Registre manipuladores com a lambda(recipient, message)e o modificadorstaticpara que você nunca capturethis. Herde deObservableRecipiente alterneIsActivena ativação/desativação para obter registro/cancelamento automático.
Quando usar esta funcionalidade
- Dois ou mais ViewModels precisam reagir a um evento (login, mudança de tema, salvar, navegação) sem manter referências uns aos outros
- Um ViewModel precisa pedir um valor a outro VM (solicitar/responder)
- Você está escopando eventos para um subsistema ou janela com tokens de canal
- Diagnosticando problemas de "meu manipulador nunca é acionado" ou problemas de tempo de vida do destinatário de referência fraca
Para geradores de código-fonte, classes base e comandos, consulte a funcionalidade mvvm-toolkit. Para configuração de DI (registrar uma instância IMessenger), consulte mvvm-toolkit-di.
Escolha uma implementação
| Tipo | Quando |
|---|---|
WeakReferenceMessenger.Default |
Padrão. Destinatários mantidos fracamente — elegíveis para GC mesmo enquanto registrados. O corte interno é executado durante GCs completos; nenhum Cleanup() manual é necessário. |
StrongReferenceMessenger.Default |
O profiler mostra que o messenger está ativo e a alocação importa. Os destinatários são fixados até que você Unregister. Esquecer o cancelamento de registro os vaza. |
Instância Custom IMessenger |
Por janela/por escopo (por exemplo, um messenger por janela do aplicativo). Construa diretamente, injete via DI. |
O construtor sem parâmetros de ObservableRecipient usa WeakReferenceMessenger.Default. Passe um IMessenger diferente para o seu construtor para substituir.
Definir uma mensagem
O toolkit fornece classes base; qualquer classe funciona.
using CommunityToolkit.Mvvm.Messaging.Messages;
// Single-payload broadcast
public sealed class LoggedInUserChangedMessage(User user)
: ValueChangedMessage<User>(user);
// Custom shape (records are great for this)
public sealed record ThemeChangedMessage(AppTheme NewTheme);
// Empty signal
public sealed record RefreshRequestedMessage;
Registrar um destinatário
Estilo Lambda (recomendado)
WeakReferenceMessenger.Default.Register<MyViewModel, ThemeChangedMessage>(
this,
static (recipient, message) => recipient.OnThemeChanged(message.NewTheme));
O modificador static impede a alocação acidental de fechamento e mantém this fora da lambda — use o parâmetro recipient em vez disso.
Estilo de interface IRecipient<TMessage>
public sealed class MyViewModel : ObservableRecipient,
IRecipient<ThemeChangedMessage>,
IRecipient<RefreshRequestedMessage>
{
public void Receive(ThemeChangedMessage message) { /* ... */ }
public void Receive(RefreshRequestedMessage message) { /* ... */ }
}
ObservableRecipient.OnActivated() chama Messenger.RegisterAll(this), que assina cada interface IRecipient<T> implementada pelo tipo. Se você não estiver usando ObservableRecipient, registre manualmente:
WeakReferenceMessenger.Default.RegisterAll(this);
Enviar uma mensagem
WeakReferenceMessenger.Default.Send(new ThemeChangedMessage(AppTheme.Dark));
// Empty payloads use the parameterless overload:
WeakReferenceMessenger.Default.Send<RefreshRequestedMessage>();
Canais (tokens)
Escope mensagens para um subsistema ou janela com um token (qualquer valor equatable — int, string, Guid):
const int LeftPaneChannel = 1;
WeakReferenceMessenger.Default.Register<MyViewModel, RefreshRequestedMessage, int>(
this, LeftPaneChannel,
static (r, _) => r.RefreshLeft());
WeakReferenceMessenger.Default.Send(new RefreshRequestedMessage(), LeftPaneChannel);
Mensagens enviadas sem um token usam o canal compartilhado padrão — elas não são entregues a destinatários com escopo de canal.
Solicitar / Responder
Para cenários de "perguntar" onde um destinatário fornece um valor de volta ao remetente, use a família RequestMessage<T>.
Solicitação síncrona
public sealed class CurrentUserRequest : RequestMessage<User> { }
WeakReferenceMessenger.Default.Register<UserService, CurrentUserRequest>(
this,
static (r, m) => m.Reply(r.CurrentUser));
User user = WeakReferenceMessenger.Default.Send<CurrentUserRequest>();
A conversão implícita de CurrentUserRequest para User lança uma exceção se nenhum
…
Perguntas frequentes
Qual a diferença entre 'WeakReferenceMessenger' e 'StrongReferenceMessenger'?
'WeakReferenceMessenger' é o padrão e permite que o programa libere a memória de quem recebeu a mensagem se não for mais necessário. 'StrongReferenceMessenger' mantém a referência ativa até que seja explicitamente removida, o que pode causar vazamentos de memória se não for gerenciado corretamente.
O que é 'ObservableRecipient'?
É uma classe que facilita o registro e cancelamento automático de mensagens quando o componente está ativo ou inativo, simplificando o gerenciamento do ciclo de vida das mensagens.
Como eu envio uma mensagem?
Você usa o método 'Send' do Messenger, passando a mensagem que deseja enviar. Por exemplo: `WeakReferenceMessenger.Default.Send(new MinhaMensagem());`
Detalhes
Descrição original do autor
CommunityToolkit.Mvvm Messenger pub/sub for decoupled communication between ViewModels (or any objects). Covers WeakReferenceMessenger vs StrongReferenceMessenger, IRecipient<TMessage>, RequestMessage<T> / AsyncRequestMessage<T> / CollectionRequestMessage<T>, ValueChangedMessage<T>, channels (tokens), and the ObservableRecipient activation lifecycle. Use across WPF, WinUI 3, .NET MAUI, Uno, and Av
repo: github/awesome-copilot
Popularidade
- Estrelas no GitHub
- 40 mil
- Posição no ranking
- #5246
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
acquire-codebase-knowledge
Ajuda seu agente a entender e documentar um projeto de código existente. É útil para novas pessoas entrarem no projeto ou para ter uma visão geral da arquitetura.
github/awesome-copilot
acreadiness-assess
Faz seu agente avaliar a prontidão de um projeto para IA e gerar um relatório. É útil para entender o quão bem um projeto está preparado para usar ferramentas de IA.
github/awesome-copilot
acreadiness-generate-instructions
Ajuda seu agente a criar instruções para ferramentas de IA baseadas em uma avaliação. É útil para melhorar a forma como a IA interage com o código e fecha lacunas identificadas.
github/awesome-copilot
acreadiness-policy
Faz seu agente ajudar a definir ou aplicar políticas para avaliação de projetos de IA. É útil para padronizar a forma como os projetos são avaliados e garantir conformidade.
github/awesome-copilot
Skills parecidas
api-connector-builder
Faz seu agente construir novas conexões com APIs seguindo o padrão já existente. Use quando precisar adicionar mais uma integração sem criar um novo jeito de fazer.
affaan-m/ECC
api-design
Ajuda seu agente a projetar APIs REST seguindo as melhores práticas. É útil para definir como as APIs se comunicam, como os erros são mostrados e como organizar os dados.
affaan-m/ECC
backend-patterns
Ajuda seu agente com padrões de arquitetura do lado do servidor e otimização de banco de dados. É útil para construir ou revisar o código que roda no servidor.
affaan-m/ECC