Compartilhar via


Migração do MvvmLight

Este artigo descreve algumas das principais diferenças entre o Kit de Ferramentas MvvmLight e o Kit de Ferramentas MVVM para facilitar sua migração.

Embora este artigo se concentre especificamente nas migrações do MvvmLight para o Kit de Ferramentas MVVM, observe que há melhorias adicionais que foram feitas no Kit de Ferramentas MVVM, portanto, é altamente recomendável dar uma olhada na documentação das novas APIs individuais.

APIs da plataforma:ObservableObject, ObservableRecipient, RelayCommand, RelayCommand<T>, AsyncRelayCommand, AsyncRelayCommand<T>, IMessenger, WeakReferenceMessenger, StrongReferenceMessenger, IRecipient<TMessage>, MessageHandler<TRecipient, TMessage>, IMessengerExtensions

Instalar o Kit de Ferramentas MVVM

Para aproveitar o Kit de Ferramentas MVVM, primeiro você precisará instalar o pacote NuGet mais recente em seu aplicativo .NET existente.

Instalar por meio da CLI do .NET

dotnet add package CommunityToolkit.Mvvm --version 8.1.0

Instalar por meio do PackageReference

<PackageReference Include="CommunityToolkit.Mvvm" Version="8.1.0" />

Migração do ObservableObject

As etapas a seguir se concentram na migração de seus componentes existentes que aproveitam o ObservableObject do Kit de Ferramentas MvvmLight. O Kit de Ferramentas MVVM fornece um tipo de ObservableObject semelhante.

A primeira alteração aqui será a troca usando diretivas em seus componentes.

// MvvmLight
using GalaSoft.MvvmLight;

// MVVM Toolkit
using CommunityToolkit.Mvvm.ComponentModel;

Veja abaixo uma lista de migrações que precisarão ser executadas se forem usadas em sua solução atual.

Métodos ObservableObject

Set<T>(Expression, ref T, T)

Set(Expression, ref T, T) não possui uma substituição de assinatura do método semelhante.

No entanto, SetProperty(ref T, T, string) fornece a mesma funcionalidade com benefícios adicionais de desempenho.

// MvvmLight
Set(() => MyProperty, ref this.myProperty, value);

// MVVM Toolkit
SetProperty(ref this.myProperty, value);

Observe que o parâmetro string não será necessário se o método estiver sendo chamado do setter da propriedade, pois é inferido do nome do membro do chamador, como pode ser visto aqui. Se você quiser invocar SetProperty de uma propriedade diferente daquela em que o método está sendo invocado, poderá fazer isso usando o operador nameof que pode ser útil para tornar o código menos sujeito a erros por não ter nomes codificados. Por exemplo:

SetProperty(ref this.someProperty, value, nameof(SomeProperty));

Set<T>(string, ref T, T)

Set<T>(string, ref T, T) não possui uma substituição de assinatura do método semelhante.

No entanto, SetProperty<T>(ref T, T, string) fornece a mesma funcionalidade com parâmetros reordenados.

// MvvmLight
Set(nameof(MyProperty), ref this.myProperty, value);

// MVVM Toolkit
SetProperty(ref this.myProperty, value);

Set<T>(ref T, T, string)

Set<T>(ref T, T, string) possui uma substituição direta renomeada, SetProperty<T>(ref T, T, string).

// MvvmLight
Set(ref this.myProperty, value, nameof(MyProperty));

// MVVM Toolkit
SetProperty(ref this.myProperty, value);

RaisePropertyChanged(string)

RaisePropertyChanged(string) possui uma substituição direta renomeada, OnPropertyChanged(string).

// MvvmLight
RaisePropertyChanged(nameof(MyProperty));

// MVVM Toolkit
OnPropertyChanged();

Assim como acontece com SetProperty, o nome da propriedade atual é inferido automaticamente pelo método OnPropertyChanged. Se você quiser usar esse método para gerar manualmente o evento PropertyChanged para outra propriedade, também poderá especificar manualmente o nome dessa propriedade usando o operador nameof novamente. Por exemplo:

OnPropertyChanged(nameof(SomeProperty));

RaisePropertyChanged<T>(Expression)

RaisePropertyChanged<T>(Expression) não possui um substituição direta.

É recomendável melhorar o desempenho que você substitui RaisePropertyChanged<T>(Expression) pelo OnPropertyChanged(string) do Kit de Ferramentas usando a palavra-chave nameof em vez disso (ou sem parâmetros, se a propriedade de destino for a mesma chama o método, para que o nome possa ser inferido automaticamente conforme mencionado acima).

// MvvmLight
RaisePropertyChanged(() => MyProperty);

// MVVM Toolkit
OnPropertyChanged(nameof(MyProperty));

VerifyPropertyName(string)

Não há substituição direta para o método VerifyPropertyName(string) e os códigos que o utilizam devem ser alterados ou removidos.

O motivo da omissão do Kit de Ferramentas MVVM é que o uso da palavra-chave nameof de uma propriedade verifica se ele existe. Quando o MvvmLight foi criado, a palavra-chave nameof não estava disponível e esse método foi utilizado para garantir que a propriedade existia no objeto.

// MvvmLight
VerifyPropertyName(nameof(MyProperty));

// MVVM Toolkit
// No direct replacement, remove

Propriedades ObservableObject

PropertyChangedHandler

PropertyChangedHandler não possui um substituição direta.

Para gerar um evento de propriedade alterada por meio do manipulador de eventos PropertyChanged, você precisará chamar o método OnPropertyChanged.

// MvvmLight
PropertyChangedEventHandler handler = PropertyChangedHandler;

// MVVM Toolkit
OnPropertyChanged();

Migração do ViewModelBase

As etapas a seguir se concentram na migração de seus componentes existentes que aproveitam o ViewModelBase do Kit de Ferramentas MvvmLight.

O Kit de Ferramentas MVVM fornece um tipo de ObservableRecipient que oferece funcionalidades semelhantes.

Veja abaixo uma lista de migrações que precisarão ser executadas se forem usadas em sua solução atual.

Métodos ViewModelBase

Set<T>(string, ref T, T, bool)

Set<T>(string, ref T, T, bool) não possui uma substituição de assinatura do método semelhante.

No entanto, SetProperty<T>(ref T, T, bool, string) fornece a mesma funcionalidade com parâmetros reordenados.

// MvvmLight
Set(nameof(MyProperty), ref this.myProperty, value, true);

// MVVM Toolkit
SetProperty(ref this.myProperty, value, true);

Observe que os parâmetros boolianos de valor e difusão não são opcionais na implementação do Kit de Ferramentas MVVM e devem ser fornecidos para usar esse método. O motivo dessa alteração é que, ao omitir o parâmetro de difusão ao chamar esse método, ele chamará por padrão o método SetProperty do ObservableObject.

Além disso, o parâmetro string não será necessário se o método estiver sendo chamado do setter da propriedade, pois é inferido do nome do membro do chamador, assim como com os métodos na classe ObservableObject base.

Set<T>(ref T, T, bool, string)

Set<T>(ref T, T, bool, string) possui uma substituição direta renomeada, SetProperty<T>(ref T, T, bool, string).

// MvvmLight
Set(ref this.myProperty, value, true, nameof(MyProperty));

// MVVM Toolkit
SetProperty(ref this.myProperty, value, true);

Set<T>(Expression, ref T, T, bool)

Set<T>(Expression, ref T, T, bool) não possui um substituição direta.

É recomendável que você substitua isso pelo SetProperty<T>(ref T, T, bool, string) do Kit de Ferramentas MVVM usando a palavra-chave nameof.

// MvvmLight
Set<MyObject>(() => MyProperty, ref this.myProperty, value, true);

// MVVM Toolkit
SetProperty(ref this.myProperty, value, true);

Broadcast<T>(T, T, string)

Broadcast<T>(T, T, string) possui uma substituição direta que não requer uma renomeação.

// MvvmLight
Broadcast<MyObject>(oldValue, newValue, nameof(MyProperty));

// MVVM Toolkit
Broadcast(oldValue, newValue, nameof(MyProperty));

Observe que a mensagem enviada por meio da propriedade Messenger ao chamar o método Broadcast tem uma substituição direta para PropertyChangedMessage dentro da biblioteca do Kit de Ferramentas MVVM.

RaisePropertyChanged<T>(string, T, T, bool)

Não há substituição direta para o método RaisePropertyChanged<T>(string, T, T, bool).

A alternativa mais simples é chamar OnPropertyChanged e, posteriormente, chamar Broadcast para obter essa funcionalidade.

// MvvmLight
RaisePropertyChanged<MyObject>(nameof(MyProperty), oldValue, newValue, true);

// MVVM Toolkit
OnPropertyChanged();
Broadcast(oldValue, newValue, nameof(MyProperty));

RaisePropertyChanged<T>(Expression, T, T, bool)

Não há substituição direta para o método RaisePropertyChanged<T>(Expression, T, T, bool).

A alternativa mais simples é chamar OnPropertyChanged e, posteriormente, chamar Broadcast para obter essa funcionalidade.

// MvvmLight
RaisePropertyChanged<MyObject>(() => MyProperty, oldValue, newValue, true);

// MVVM Toolkit
OnPropertyChanged(nameof(MyProperty));
Broadcast(oldValue, newValue, nameof(MyProperty));

ICleanup.Cleanup()

Não há substituição direta para a interface ICleanup.

No entanto, o ObservableRecipient fornece um método OnDeactivated que deve ser usado para fornecer a mesma funcionalidade que Cleanup.

OnDeactivated no Kit de Ferramentas MVVM também cancelará o registro de todos os eventos do mensageiro registrados quando chamado.

// MvvmLight
Cleanup();

// MVVM Toolkit
OnDeactivated();

Observe que os métodos OnActivated e OnDeactivated podem ser chamados de sua solução existente como com Cleanup.

No entanto, o ObservableRecipient expõe uma propriedade IsActive que também controla a chamada a esses métodos quando definida.

Propriedades ViewModelBase

MessengerInstance

MessengerInstance possui uma substituição direta renomeada, Messenger.

// MvvmLight
IMessenger messenger = MessengerInstance;

// MVVM Toolkit
IMessenger messenger = Messenger;

Observação

O valor padrão da propriedade Messenger será a instância de WeakReferenceMessenger.Default, que é a implementação do mensageiro de referência fraca padrão no Kit de Ferramentas MVVM. Isso pode ser personalizado apenas injetando uma instância de IMessenger diferente no construtor ObservableRecipient.

IsInDesignMode

Não há substituição direta para a propriedade IsInDesignMode e os códigos que o utilizam devem ser alterados ou removidos.

O motivo da omissão do Kit de Ferramentas MVVM é que a propriedade IsInDesignMode expôs implementações específicas da plataforma. O Kit de Ferramentas MVVM foi projetado para ser independente da plataforma.

// MvvmLight
var isInDesignMode = IsInDesignMode;

// MVVM Toolkit
// No direct replacement, remove

Propriedades estáticas ViewModelBase

IsInDesignModeStatic

Não há substituição direta para a propriedade IsInDesignModeStatic e os códigos que o utilizam devem ser alterados ou removidos.

O motivo da omissão do Kit de Ferramentas MVVM é que a propriedade IsInDesignMode expôs implementações específicas da plataforma. O Kit de Ferramentas MVVM foi projetado para ser independente da plataforma.

// MvvmLight
var isInDesignMode = ViewModelBase.IsInDesignModeStatic;

// MVVM Toolkit
// No direct replacement, remove

Migração do RelayCommand

As etapas a seguir se concentram na migração de seus componentes existentes que aproveitam o RelayCommand do Kit de Ferramentas MvvmLight.

O Kit de Ferramentas MVVM fornece um tipo de RelayCommand que oferece funcionalidade semelhante aproveitando a interface do sistema ICommand.

Veja abaixo uma lista de migrações que precisarão ser executadas se forem usadas em sua solução atual. Quando um método ou propriedade não está listado, há uma substituição direta com o mesmo nome no Kit de Ferramentas MVVM e não há nenhuma alteração necessária.

A primeira alteração aqui será a troca usando diretivas em seus componentes.

// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;

// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;

Observação

O MvvmLight usa referências fracas para estabelecer o vínculo entre o comando e a ação chamada da classe associada. Isso não é exigido pela implementação do Kit de Ferramentas MVVM e, se esse parâmetro opcional tiver sido definido como true em qualquer um dos construtores, isso será removido.

Usar o RelayCommand com ações assíncronas

Se você estiver usando a implementação do MvvmLight RelayCommand com ações assíncronas, o Kit de Ferramentas MVVM exporá uma implementação aprimorada para esses cenários.

Você pode simplesmente substituir o RelayCommand existente pelo AsyncRelayCommand que foi criado para fins assíncronos.

// MvvmLight
var command = new RelayCommand(() => OnCommandAsync());
var command = new RelayCommand(async () => await OnCommandAsync());

// MVVM Toolkit
var asyncCommand = new AsyncRelayCommand(OnCommandAsync);

Métodos do RelayCommand

RaiseCanExecuteChanged()

A funcionalidade do RaiseCanExecuteChanged() pode ser obtida com o método NotifyCanExecuteChanged() do Kit de Ferramentas MVVM.

// MvvmLight
var command = new RelayCommand(OnCommand);
command.RaiseCanExecuteChanged();

// MVVM Toolkit
var command = new RelayCommand(OnCommand);
command.NotifyCanExecuteChanged();

Migração do RelayCommand<T>

As etapas a seguir se concentram na migração de seus componentes existentes que aproveitam o RelayCommand<T> do Kit de Ferramentas MvvmLight.

O Kit de Ferramentas MVVM fornece um tipo de RelayCommand<T> que oferece funcionalidade semelhante aproveitando a interface do sistema ICommand.

Veja abaixo uma lista de migrações que precisarão ser executadas se forem usadas em sua solução atual. Quando um método ou propriedade não está listado, há uma substituição direta com o mesmo nome no Kit de Ferramentas MVVM e não há nenhuma alteração necessária.

A primeira alteração aqui será a troca usando diretivas em seus componentes.

// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;

// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;

Usar o RelayCommand com ações assíncronas

Se você estiver usando a implementação do MvvmLight RelayCommand<T> com ações assíncronas, o Kit de Ferramentas MVVM exporá uma implementação aprimorada para esses cenários.

Você pode simplesmente substituir o RelayCommand<T> existente pelo AsyncRelayCommand<T> que foi criado para fins assíncronos.

// MvvmLight
var command = new RelayCommand<string>(async () => await OnCommandAsync());

// MVVM Toolkit
var asyncCommand = new AsyncRelayCommand<string>(OnCommandAsync);

RelayCommand<T> Métodos

RaiseCanExecuteChanged()

A funcionalidade do RaiseCanExecuteChanged() pode ser obtida com o método NotifyCanExecuteChanged() do Kit de Ferramentas MVVM.

// MvvmLight
var command = new RelayCommand<string>(OnCommand);
command.RaiseCanExecuteChanged();

// MVVM Toolkit
var command = new RelayCommand<string>(OnCommand);
command.NotifyCanExecuteChanged();

Migração do SimpleIoc

A implementação do IoC no Kit de Ferramentas MVVM não inclui nenhuma lógica interna para lidar com a injeção de dependência por conta própria, portanto, você pode usar qualquer biblioteca de terceiros para recuperar uma instância de IServiceProvider que você pode passar para o método Ioc.ConfigureServices. Nos exemplos abaixo, o tipo de ServiceCollection da biblioteca de Microsoft.Extensions.DependencyInjection será usado.

Essa é a maior mudança entre o MvvmLight e o Kit de Ferramentas MVVM.

Essa implementação parecerá familiar se você tiver implementado a injeção de dependência com aplicativos ASP.NET Core.

Registrar suas dependências

Com o MvvmLight, você pode ter registrado suas dependências semelhantes a esses cenários usando SimpleIoc.

public void RegisterServices()
{
  SimpleIoc.Default.Register<INavigationService, NavigationService>();

  SimpleIoc.Default.Register<IDialogService>(() => new DialogService());
}

Com o Kit de Ferramentas MVVM, você conseguiria o mesmo resultado.

public void RegisterServices()
{
  Ioc.Default.ConfigureServices(
    new ServiceCollection()
    .AddSingleton<INavigationService, NavigationService>()
    .AddSingleton<IDialogService>(new DialogService())
    .BuildServiceProvider());
}

Resolver dependências

Depois de inicializados, os serviços podem ser recuperados da classe Ioc exatamente como com SimpleIoc:

IDialogService dialogService = SimpleIoc.Default.GetInstance<IDialogService>();

Ao migrar para o Kit de Ferramentas MVVM, você conseguiria o mesmo resultado com:

IDialogService dialogService = Ioc.Default.GetService<IDialogService>();

Removendo dependências

Com SimpleIoc, você cancelaria o registro de suas dependências com a chamada de método a seguir.

SimpleIoc.Default.Unregister<INavigationService>();

Não há substituição direta para remover dependências com a implementação do Kit de Ferramentas MVVM Ioc.

Construtor preferencial

Ao registrar suas dependências no SimpleIoc do MvvmLight, você terá a opção em suas classes de fornecer um atributo PreferredConstructor para aqueles com vários construtores.

Esse atributo precisará ser retirado quando usado e você precisará usar todos os atributos da biblioteca de injeção de dependência de terceiros em uso, se houver suporte.

Migração do Messenger

As etapas a seguir se concentram na migração de seus componentes existentes que aproveitam o Messenger do Kit de Ferramentas MvvmLight.

O Kit de Ferramentas MVVM fornece duas implementações do mensageiro (WeakReferenceMessenger e StrongReferenceMessenger, confira os documentos aqui) que fornece funcionalidade semelhante, com algumas diferenças importantes detalhadas abaixo.

Veja abaixo uma lista de migrações que precisarão ser executadas se forem usadas em sua solução atual.

A primeira alteração aqui será a troca usando diretivas em seus componentes.

// MvvmLight
using GalaSoft.MvvmLight.Messaging;

// MVVM Toolkit
using CommunityToolkit.Mvvm.Messaging;

Métodos do mensageiro

Register<TMessage>(object, Action<TMessage>)

A funcionalidade do Register<TMessage>(object, Action<TMessage>) pode ser obtida com o método de extensão IMessenger do Kit de Ferramentas MVVM Register<TRecipient, TMessage>(object, MessageHandler<TRecipient, TMessage>).

// MvvmLight
Messenger.Default.Register<MyMessage>(this, this.OnMyMessageReceived);

// MVVM Toolkit
Messenger.Register<MyViewModel, MyMessage>(this, static (r, m) => r.OnMyMessageReceived(m));

O motivo dessa assinatura é que ela permite que o mensageiro use referências fracas para rastrear corretamente os destinatários e evitar a criação de fechamentos para capturar o próprio destinatário. Ou seja, o destinatário de entrada é passado como uma entrada para a expressão lambda, portanto, ele não precisa ser capturado pela própria expressão lambda. Isso também resulta em um código mais eficiente, pois o mesmo manipulador pode ser reutilizado várias vezes sem alocações. Observe que essa é apenas uma das maneiras compatíveis de registrar manipuladores e também é possível usar a interface IRecipient<TMessage> (detalhada nos documentos do mensageiro), o que torna o registro automático e menos detalhado.

Observação

O modificador static da expressões lambda requer C# 9 e é opcional. É útil usá-lo aqui para garantir que você não capture acidentalmente o destinatário ou algum outro membro, causando assim a alocação de um fechamento, mas não é obrigatório. Se você não puder usar o C# 9, basta remover static aqui e ter cuidado para garantir que o código não esteja capturando nada.

Além disso, este exemplo e os outros abaixo usarão apenas a propriedade Messenger de ObservableRecipient. Se você quiser acessar estaticamente uma instância do mensageiro de qualquer outro lugar do seu código, os mesmos exemplos também se aplicam, com a única diferença sendo que Messenger precisa ser substituído por exemplo. WeakReferenceMessenger.Default em vez disso.

Register<TMessage>(object, bool, Action<TMessage>)

Não há substituto direto para esse mecanismo de registro que também permite suportar o recebimento de mensagens para tipos de mensagens derivadas. Esta mudança é intencional, pois a implementação do Messenger visa não utilizar a reflexão para obter benefícios de desempenho.

Como alternativa, há algumas opções do que pode ser feito para obter essa funcionalidade.

  • Crie uma implementação de IMessenger personalizada.
  • Registre os tipos de mensagem adicionais usando um manipulador compartilhado que verifica o tipo e invoca o método correto.
// MvvmLight
Messenger.Default.Register<MyMessage>(this, true, this.OnMyMessageReceived);

// MVVM Toolkit
Messenger.Register<MyViewModel, MyMessage>(this, static (r, m) => r.OnMyMessageReceived(m));
Messenger.Register<MyViewModel, MyOtherMessage>(this, static (r, m) => r.OnMyMessageReceived(m));

Register<TMessage>(object, object, Action<TMessage>)

A funcionalidade do Register<TMessage>(object, object, Action<TMessage>) pode ser obtida com o método Register<TRecipient, TMessage, TToken>(object, TToken, MessageHandler<TRecipient, TMessage>) do Kit de Ferramentas MVVM.

// MvvmLight
Messenger.Default.Register<MyMessage>(this, nameof(MyViewModel), this.OnMyMessageReceived);

// MVVM Toolkit
Messenger.Register<MyViewModel, MyMessage, string>(this, nameof(MyViewModel), static (r, m) => r.OnMyMessageReceived(m));

Register<TMessage>(object, object, bool, Action<TMessage>)

Não há substituto direto para esse mecanismo de registro que também permite suportar o recebimento de mensagens para tipos de mensagens derivadas. Esta mudança é intencional, pois a implementação do Messenger visa não utilizar a reflexão para obter benefícios de desempenho.

Como alternativa, há algumas opções do que pode ser feito para obter essa funcionalidade.

  • Crie uma implementação de IMessenger personalizada.
  • Registre os tipos de mensagem adicionais usando um manipulador compartilhado que verifica o tipo e invoca o método correto.
// MvvmLight
Messenger.Default.Register<MyMessage>(this, nameof(MyViewModel), true, this.OnMyMessageReceived);

// MVVM Toolkit
Messenger.Register<MyViewModel, MyMessage, string>(this, nameof(MyViewModel), static (r, m) => r.OnMyMessageReceived(m));
Messenger.Register<MyViewModel, MyOtherMessage, string>(this, nameof(MyViewModel), static (r, m) => r.OnMyMessageReceived(m));

Send<TMessage>(TMessage)

A funcionalidade do Send<TMessage>(TMessage) pode ser obtida com o método de extensão IMessenger do Kit de Ferramentas MVVM Send<TMessage>(TMessage).

// MvvmLight
Messenger.Default.Send<MyMessage>(new MyMessage());
Messenger.Default.Send(new MyMessage());

// MVVM Toolkit
Messenger.Send(new MyMessage());

No cenário acima, onde a mensagem enviada possui um construtor sem parâmetros, o Kit de Ferramentas MVVM possui uma extensão simplificada para enviar uma mensagem neste formato.

// MVVM Toolkit
Messenger.Send<MyMessage>();

Send<TMessage>(TMessage, object)

A funcionalidade do Send<TMessage>(TMessage, object) pode ser obtida com o método Send<TMessage, TToken>(TMessage, TToken) do Kit de Ferramentas MVVM.

// MvvmLight
Messenger.Default.Send<MyMessage>(new MyMessage(), nameof(MyViewModel));
Messenger.Default.Send(new MyMessage(), nameof(MyViewModel));

// MVVM Toolkit
Messenger.Send(new MyMessage(), nameof(MyViewModel));

Unregister(object)

A funcionalidade do Unregister(object) pode ser obtida com o método UnregisterAll(object) do Kit de Ferramentas MVVM.

// MvvmLight
Messenger.Default.Unregister(this);

// MVVM Toolkit
Messenger.UnregisterAll(this);

Unregister<TMessage>(object)

A funcionalidade do Unregister<TMessage>(object) pode ser obtida com o método de extensão IMessenger do Kit de Ferramentas MVVM Unregister<TMessage>(object).

// MvvmLight
Messenger.Default.Unregister<MyMessage>(this);

// MVVM Toolkit
Messenger.Unregister<MyMessage>(this);

Unregister<TMessage>(object, Action<TMessage>)

Não há substituição direta para o método Unregister<TMessage>(object, Action<TMessage>) no Kit de Ferramentas MVVM.

O motivo da omissão é que um destinatário da mensagem só pode ter um único manipulador registrado para qualquer tipo de mensagem fornecido.

É recomendável obter essa funcionalidade com o método de extensão IMessenger do Kit de Ferramentas MVVM Unregister<TMessage>(object).

// MvvmLight
Messenger.Default.Unregister<MyMessage>(this, OnMyMessageReceived);

// MVVM Toolkit
Messenger.Unregister<MyMessage>(this);

Unregister<TMessage>(object, object)

A funcionalidade do Unregister<TMessage>(object, object) pode ser obtida com o método Unregister<TMessage, TToken>(object, TToken) do Kit de Ferramentas MVVM.

// MvvmLight
Messenger.Default.Unregister<MyMessage>(this, nameof(MyViewModel));

// MVVM Toolkit
Messenger.Unregister<MyMessage, string>(this, nameof(MyViewModel));

Unregister<TMessage>(object, object, Action<TMessage>)

Não há substituição direta para o método Unregister<TMessage>(object, object, Action<TMessage>) no Kit de Ferramentas MVVM.

O motivo da omissão é que um destinatário da mensagem só pode ter um único manipulador registrado para qualquer tipo de mensagem fornecido.

É recomendável obter essa funcionalidade com o método Unregister<TMessage, TToken>(object, TToken) do Kit de Ferramentas MVVM.

// MvvmLight
Messenger.Default.Unregister<MyMessage>(this, nameof(MyViewModel), OnMyMessageReceived);

// MVVM Toolkit
Messenger.Unregister<MyMessage, string>(this, nameof(MyViewModel));

Cleanup()

O método Cleanup possui uma substituição direta com o mesmo nome no Kit de Ferramentas MVVM. Observe que esse método só é útil quando um mensageiro que usa referências fracas está sendo usado, enquanto o tipo de StrongReferenceMessenger simplesmente não fará nada quando esse método é chamado, pois o estado interno já é cortado automaticamente conforme o mensageiro é usado.

// MvvmLight
Messenger.Default.Cleanup();

// MVVM Toolkit
Messenger.Cleanup();

RequestCleanup()

Não há substituição direta para o método RequestCleanup no Kit de Ferramentas MVVM. No contexto do MvvmLight, RequestCleanup é usado para iniciar uma solicitação para remover registros que não estão mais ativos, pois a implementação aproveita as referências fracas.

Todas as chamadas para o método RequestCleanup podem ser removidas ou substituídas por Cleanup.

// MvvmLight
Messenger.Default.RequestCleanup();

// MVVM Toolkit
// No direct replacement, remove

ResetAll()

A funcionalidade do ResetAll() pode ser obtida com o método Reset() do Kit de Ferramentas MVVM.

Ao contrário da implementação do MvvmLight que anula a instância, o Kit de Ferramentas MVVM limpa os mapas registrados.

// MvvmLight
Messenger.Default.ResetAll();

// MVVM Toolkit
Messenger.Reset();

Métodos estáticos do mensageiro

OverrideDefault(IMessenger)

Não há substituição direta para o método OverrideDefault(IMessenger) no Kit de Ferramentas MVVM.

Para usar uma implementação personalizada do IMessenger, registre a implementação personalizada nos registros de serviço para injeção de dependência ou construa manualmente uma instância estática e passe isso quando necessário.

// MvvmLight
Messenger.OverrideDefault(new Messenger());

// MVVM Toolkit
// No direct replacement

Reset()

Não há substituição direta para o método Reset estático no Kit de Ferramentas MVVM.

A mesma funcionalidade pode ser obtida chamando o método Reset da instância de Default estática de um dos tipos do mensageiro.

// MvvmLight
Messenger.Reset();

// MVVM Toolkit
WeakReferenceMessenger.Default.Reset();

Propriedades estáticas do mensageiro

Default

Default tem uma substituição direta, Default. Não exige nenhuma alteração na implementação existente.

// MvvmLight
IMessenger messenger = Messenger.Default;

// MVVM Toolkit
IMessenger messenger = WeakReferenceMessenger.Default;

Migração de tipos de mensagens

Os tipos de mensagem fornecidos no Kit de Ferramentas MvvmLight são projetados como uma base para você trabalhar, como desenvolvedor, se necessário.

Embora o Kit de Ferramentas MVVM forneça algumas alternativas, não há substituição direta para esses tipos de mensagem. Recomendamos examinar nossos tipos de mensagens disponíveis.

Como alternativa, se sua solução aproveitar os tipos de mensagem do MvvmLight, elas poderão ser facilmente portadas em sua própria base de código.

Migração de componentes específicos da plataforma

Na implementação atual do Kit de Ferramentas MVVM, não há substituições para componentes específicos da plataforma que existem no Kit de Ferramentas MvvmLight.

Os seguintes componentes e seus métodos auxiliares/de extensão associados não possuem uma substituição e precisarão ser considerados ao migrar para o Kit de Ferramentas MVVM.

Específico do Android/iOS/Windows

  • DialogService
  • DispatcherHelper
  • NavigationService

Específico do Android/iOS

  • ActivityBase
  • Binding
  • BindingMode
  • PropertyChangedEventManager
  • UpdateTriggerMode

Específico do Android

  • CachingViewHolder
  • ObservableAdapter
  • ObservableRecyclerAdapter

Específico do iOS

  • ObservableCollectionViewSource
  • ObservableTableViewController
  • ObservableTableViewSource

Auxiliares

  • Empty
  • WeakAction
  • WeakFunc