Migración desde MvvmLight

En este artículo se describen algunas de las principales diferencias entre MvvmLight Toolkit y MVVM Toolkit para facilitar la migración.

Aunque este artículo se centra específicamente en las migraciones de MvvmLight al kit de herramientas de MVVM, tenga en cuenta que hay mejoras adicionales que se han realizado en el kit de herramientas de MVVM, por lo que es muy recomendable echar un vistazo a la documentación de las nuevas API individuales.

API de plataforma:ObservableObject, ObservableRecipient, , RelayCommandRelayCommand<T>, AsyncRelayCommandAsyncRelayCommand<T>IMessengerWeakReferenceMessenger, StrongReferenceMessenger, , , IRecipient<TMessage>MessageHandler<TRecipient, TMessage>IMessengerExtensions

Instalación del kit de herramientas de MVVM

Para aprovechar el kit de herramientas de MVVM, primero deberá instalar el paquete NuGet más reciente en la aplicación de .NET existente.

Instalación a través de .NET CLI

dotnet add package CommunityToolkit.Mvvm --version 8.1.0

Instalación mediante PackageReference

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

Migración de ObservableObject

Los pasos siguientes se centran en migrar los componentes existentes que aprovechan el ObservableObject de MvvmLight Toolkit. El kit de herramientas de MVVM proporciona un ObservableObject tipo similar.

El primer cambio aquí será intercambiar directivas using en los componentes.

// MvvmLight
using GalaSoft.MvvmLight;

// MVVM Toolkit
using CommunityToolkit.Mvvm.ComponentModel;

A continuación se muestra una lista de migraciones que deberán realizarse si se usan en la solución actual.

Métodos ObservableObject

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

Set(Expression, ref T, T) no tiene un reemplazo de firma de método similar.

Sin embargo, SetProperty(ref T, T, string) proporciona la misma funcionalidad con ventajas de rendimiento adicionales.

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

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

Tenga en cuenta que el string parámetro no es necesario si se llama al método desde el establecedor de la propiedad, ya que se deduce del nombre del miembro de llamada, como se puede ver aquí. Si desea invocar SetProperty para una propiedad diferente de la que se invoca el método, puede hacerlo mediante el nameof operador , lo que puede resultar útil para que el código sea menos propenso a errores si no tiene nombres codificados de forma rígida. Por ejemplo:

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

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

Set<T>(string, ref T, T) no tiene un reemplazo de firma de método similar.

Sin embargo, SetProperty<T>(ref T, T, string) proporciona la misma funcionalidad con parámetros ordenados de nuevo.

// 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) tiene un reemplazo directo cuyo nombre ha cambiado, 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) tiene un reemplazo directo cuyo nombre ha cambiado, OnPropertyChanged(string).

// MvvmLight
RaisePropertyChanged(nameof(MyProperty));

// MVVM Toolkit
OnPropertyChanged();

Al igual que con SetProperty, el método deduce OnPropertyChanged automáticamente el nombre de la propiedad actual. Si desea usar este método para generar manualmente el PropertyChanged evento para otra propiedad, también puede especificar manualmente el nombre de esa propiedad mediante el nameof operador de nuevo. Por ejemplo:

OnPropertyChanged(nameof(SomeProperty));

RaisePropertyChanged<T>(Expression)

RaisePropertyChanged<T>(Expression) no tiene un reemplazo directo.

Se recomienda para mejorar el rendimiento que reemplace RaisePropertyChanged<T>(Expression) por el kit de herramientas OnPropertyChanged(string) mediante la nameof palabra clave en su lugar (o sin parámetros, si la propiedad de destino es la misma que la que llama al método, por lo que el nombre se puede deducir automáticamente como se mencionó anteriormente).

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

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

VerifyPropertyName(string)

No hay reemplazo directo para el VerifyPropertyName(string) método y cualquier código que use esto debe modificarse o quitarse.

El motivo de la omisión del kit de herramientas de MVVM es que el uso de la nameof palabra clave para una propiedad comprueba que existe. Cuando se creó MvvmLight, la nameof palabra clave no estaba disponible y este método se usó para asegurarse de que la propiedad existía en el objeto .

// MvvmLight
VerifyPropertyName(nameof(MyProperty));

// MVVM Toolkit
// No direct replacement, remove

Propiedades observableObject

PropertyChangedHandler

PropertyChangedHandler no tiene un reemplazo directo.

Para generar un evento cambiado de propiedad a través del PropertyChanged controlador de eventos, debe llamar al OnPropertyChanged método en su lugar.

// MvvmLight
PropertyChangedEventHandler handler = PropertyChangedHandler;

// MVVM Toolkit
OnPropertyChanged();

Migración de ViewModelBase

Los pasos siguientes se centran en migrar los componentes existentes que aprovechan el ViewModelBase de MvvmLight Toolkit.

El kit de herramientas de MVVM proporciona un ObservableRecipient tipo que proporciona una funcionalidad similar.

A continuación se muestra una lista de migraciones que deberán realizarse si se usan en la solución actual.

Métodos ViewModelBase

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

Set<T>(string, ref T, T, bool) no tiene un reemplazo de firma de método similar.

Sin embargo, SetProperty<T>(ref T, T, bool, string) proporciona la misma funcionalidad con parámetros ordenados de nuevo.

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

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

Tenga en cuenta que el valor y los parámetros booleanos de difusión no son opcionales en la implementación del kit de herramientas de MVVM y se deben proporcionar para usar este método. El motivo de este cambio es que al omitir el parámetro de difusión al llamar a este método, llamará de forma predeterminada al método observableObject SetProperty .

Además, el string parámetro no es necesario si se llama al método desde el establecedor de la propiedad, ya que se deduce del nombre del miembro llamador, al igual que con los métodos de la clase base ObservableObject .

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

Set<T>(ref T, T, bool, string) tiene un reemplazo directo cuyo nombre ha cambiado, 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) no tiene un reemplazo directo.

Se recomienda para mejorar el rendimiento que reemplace por el kit de herramientas SetProperty<T>(ref T, T, bool, string) de MVVM mediante la nameof palabra clave en su lugar.

// 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) tiene un reemplazo directo que no requiere un cambio de nombre.

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

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

Tenga en cuenta que el mensaje enviado a través de la Messenger propiedad al llamar al Broadcast método tiene un reemplazo directo para PropertyChangedMessage dentro de la biblioteca MVVM Toolkit.

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

No hay reemplazo directo para el RaisePropertyChanged<T>(string, T, T, bool) método .

La alternativa más sencilla es llamar OnPropertyChanged a y, posteriormente, llamar Broadcast a para lograr esta funcionalidad.

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

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

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

No hay reemplazo directo para el RaisePropertyChanged<T>(Expression, T, T, bool) método .

La alternativa más sencilla es llamar OnPropertyChanged a y, posteriormente, llamar Broadcast a para lograr esta funcionalidad.

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

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

ICleanup.Cleanup()

No hay reemplazo directo para la ICleanup interfaz.

Sin embargo, proporciona ObservableRecipient un OnDeactivated método que se debe usar para proporcionar la misma funcionalidad Cleanupque .

OnDeactivated en el kit de herramientas de MVVM también anulará el registro de todos los eventos de mensajería registrados cuando se llame a .

// MvvmLight
Cleanup();

// MVVM Toolkit
OnDeactivated();

Tenga en cuenta que se puede llamar a los OnActivated métodos y OnDeactivated desde la solución existente como con Cleanup.

Sin embargo, ObservableRecipient expone una IsActive propiedad que también controla la llamada a estos métodos cuando se establece.

Propiedades de ViewModelBase

MessengerInstance

MessengerInstance tiene un reemplazo directo cuyo nombre ha cambiado, Messenger.

// MvvmLight
IMessenger messenger = MessengerInstance;

// MVVM Toolkit
IMessenger messenger = Messenger;

Note

El valor predeterminado de la Messenger propiedad será la WeakReferenceMessenger.Default instancia, que es la implementación estándar del mensajero de referencia débil en el kit de herramientas de MVVM. Esto se puede personalizar mediante la inserción de una instancia diferente IMessenger en el ObservableRecipient constructor.

IsInDesignMode

No hay reemplazo directo para la IsInDesignMode propiedad y cualquier código que use esto debe modificarse o quitarse.

La razón por la omisión del kit de herramientas de MVVM es que la IsInDesignMode propiedad expone implementaciones específicas de la plataforma. El kit de herramientas de MVVM se ha diseñado para ser independiente de la plataforma.

// MvvmLight
var isInDesignMode = IsInDesignMode;

// MVVM Toolkit
// No direct replacement, remove

Propiedades estáticas de ViewModelBase

IsInDesignModeStatic

No hay reemplazo directo para la IsInDesignModeStatic propiedad y cualquier código que use esto debe modificarse o quitarse.

La razón por la omisión del kit de herramientas de MVVM es que la IsInDesignMode propiedad expone implementaciones específicas de la plataforma. El kit de herramientas de MVVM se ha diseñado para ser independiente de la plataforma.

// MvvmLight
var isInDesignMode = ViewModelBase.IsInDesignModeStatic;

// MVVM Toolkit
// No direct replacement, remove

Migración de RelayCommand

Los pasos siguientes se centran en migrar los componentes existentes que aprovechan el RelayCommand de MvvmLight Toolkit.

El kit de herramientas de MVVM proporciona un RelayCommand tipo que proporciona funcionalidad similar a la que aprovecha la ICommand interfaz del sistema.

A continuación se muestra una lista de migraciones que deberán realizarse si se usan en la solución actual. Cuando no aparece un método o una propiedad, hay un reemplazo directo con el mismo nombre en el kit de herramientas de MVVM y no se requiere ningún cambio.

El primer cambio aquí será intercambiar directivas using en los componentes.

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

// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;

Note

MvvmLight usa referencias débiles para establecer el vínculo entre el comando y la acción a la que se llama desde la clase asociada. La implementación del kit de herramientas de MVVM no requiere esto y si este parámetro opcional se ha establecido true en en cualquiera de los constructores, se quitará.

Uso de RelayCommand con acciones asincrónicas

Si actualmente usa la implementación de MvvmLight RelayCommand con acciones asincrónicas, el kit de herramientas de MVVM expone una implementación mejorada para estos escenarios.

Simplemente puede reemplazar el existente RelayCommand por el AsyncRelayCommand que se ha creado con fines asincrónicos.

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

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

Métodos RelayCommand

RaiseCanExecuteChanged()

La funcionalidad de se puede lograr con el método del NotifyCanExecuteChanged() kit de RaiseCanExecuteChanged() herramientas de MVVM.

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

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

Migración RelayCommand<T>

Los pasos siguientes se centran en migrar los componentes existentes que aprovechan el RelayCommand<T> de MvvmLight Toolkit.

El kit de herramientas de MVVM proporciona un RelayCommand<T> tipo que proporciona funcionalidad similar a la que aprovecha la ICommand interfaz del sistema.

A continuación se muestra una lista de migraciones que deberán realizarse si se usan en la solución actual. Cuando no aparece un método o una propiedad, hay un reemplazo directo con el mismo nombre en el kit de herramientas de MVVM y no se requiere ningún cambio.

El primer cambio aquí será intercambiar directivas using en los componentes.

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

// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;

Uso con RelayCommand acciones asincrónicas

Si actualmente usa la implementación de MvvmLight RelayCommand<T> con acciones asincrónicas, el kit de herramientas de MVVM expone una implementación mejorada para estos escenarios.

Simplemente puede reemplazar el existente RelayCommand<T> por el AsyncRelayCommand<T> que se ha creado con fines asincrónicos.

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

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

RelayCommand<T> Métodos

RaiseCanExecuteChanged()

La funcionalidad de se puede lograr con el método del NotifyCanExecuteChanged() kit de RaiseCanExecuteChanged() herramientas de MVVM.

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

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

Migración SimpleIoc

La implementación de IoC en el kit de herramientas de MVVM no incluye ninguna lógica integrada para controlar la inserción de dependencias por sí sola, por lo que puede usar cualquier biblioteca de terceros para recuperar una IServiceProvider instancia que pueda pasar al Ioc.ConfigureServices método. En los ejemplos siguientes, se usará el tipo ServiceCollection de la biblioteca de Microsoft.Extensions.DependencyInjection.

Este es el mayor cambio entre MvvmLight y MVVM Toolkit.

Esta implementación se sentirá familiar si ha implementado la inserción de dependencias con aplicaciones de ASP.NET Core.

Registro de las dependencias

Con MvvmLight, es posible que haya registrado las dependencias similares a estos escenarios mediante SimpleIoc.

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

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

Con el kit de herramientas de MVVM, lograría lo mismo que se indica a continuación.

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

Resolución de dependencias

Una vez inicializado, los servicios se pueden recuperar de la Ioc clase igual que con SimpleIoc:

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

Migración al kit de herramientas de MVVM, logrará lo mismo con:

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

Eliminación de dependencias

Con SimpleIoc, anularía el registro de las dependencias con la siguiente llamada al método .

SimpleIoc.Default.Unregister<INavigationService>();

No hay ningún reemplazo directo para quitar dependencias con la implementación del kit de herramientas Ioc de MVVM.

Constructor preferido

Al registrar las dependencias con MvvmLight SimpleIoc, tiene la opción de proporcionar un PreferredConstructor atributo para aquellos con varios constructores.

Este atributo necesitará quitar dónde se usa y tendrá que usar los atributos de la biblioteca de inserción de dependencias de terceros en uso, si se admite.

Migración Messenger

Los pasos siguientes se centran en migrar los componentes existentes que aprovechan el Messenger de MvvmLight Toolkit.

El kit de herramientas de MVVM proporciona dos implementaciones de messenger (WeakReferenceMessenger y StrongReferenceMessenger, consulte los documentos aquí) que proporcionan una funcionalidad similar, con algunas diferencias clave que se detallan a continuación.

A continuación se muestra una lista de migraciones que deberán realizarse si se usan en la solución actual.

El primer cambio aquí será intercambiar directivas using en los componentes.

// MvvmLight
using GalaSoft.MvvmLight.Messaging;

// MVVM Toolkit
using CommunityToolkit.Mvvm.Messaging;

Métodos de Messenger

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

La funcionalidad de se puede lograr con el método Register<TRecipient, TMessage>(object, MessageHandler<TRecipient, TMessage>)de extensión del IMessenger kit de Register<TMessage>(object, Action<TMessage>) herramientas de MVVM.

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

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

La razón de esta firma es que permite al mensajero usar referencias débiles para realizar un seguimiento correcto de los destinatarios y evitar la creación de cierres para capturar el propio destinatario. Es decir, el destinatario de entrada se pasa como entrada a la expresión lambda, por lo que no es necesario capturarlo mediante la propia expresión lambda. Esto también da como resultado código más eficaz, ya que el mismo controlador se puede reutilizar varias veces sin asignaciones. Tenga en cuenta que esta es solo una de las formas admitidas de registrar controladores, y también es posible usar la IRecipient<TMessage> interfaz en su lugar (detallada en los documentos de messenger), lo que hace que el registro sea automático y menos detallado.

Note

El static modificador para expresiones lambda requiere C# 9 y es opcional. Es útil usarlo aquí para asegurarse de que no captura accidentalmente el destinatario o algún otro miembro, por lo que provoca la asignación de un cierre, pero no es obligatorio. Si no puede usar C# 9, puede quitarlo static aquí y tener cuidado de asegurarse de que el código no captura nada.

Además, este ejemplo y los siguientes simplemente usarán la Messenger propiedad de ObservableRecipient. Si desea acceder estáticamente a una instancia de Messenger desde cualquier otro lugar del código, también se aplican los mismos ejemplos, con la única diferencia que Messenger debe reemplazarse por p. ej. WeakReferenceMessenger.Default en su lugar.

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

No hay ningún reemplazo directo para este mecanismo de registro que le permite admitir la recepción de mensajes para los tipos de mensajes derivados. Este cambio es intencionado, ya que la Messenger implementación tiene como objetivo no utilizar la reflexión para lograr sus ventajas de rendimiento.

Como alternativa, hay algunas opciones que se pueden realizar para lograr esta funcionalidad.

  • Cree una implementación personalizada IMessenger .
  • Registre los tipos de mensaje adicionales mediante un controlador compartido que, a continuación, compruebe el tipo e invoque el método correcto.
// 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>)

La funcionalidad de se puede lograr con el método del Register<TRecipient, TMessage, TToken>(object, TToken, MessageHandler<TRecipient, TMessage>) kit de Register<TMessage>(object, object, Action<TMessage>) herramientas de 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>)

No hay ningún reemplazo directo para este mecanismo de registro que le permite admitir la recepción de mensajes para los tipos de mensajes derivados. Este cambio es intencionado, ya que la Messenger implementación tiene como objetivo no utilizar la reflexión para lograr sus ventajas de rendimiento.

Como alternativa, hay algunas opciones que se pueden realizar para lograr esta funcionalidad.

  • Cree una implementación personalizada IMessenger .
  • Registre los tipos de mensaje adicionales mediante un controlador compartido que, a continuación, compruebe el tipo e invoque el método correcto.
// 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)

La funcionalidad de se puede lograr con el método Send<TMessage>(TMessage)de extensión del IMessenger kit de Send<TMessage>(TMessage) herramientas de MVVM.

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

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

En el escenario anterior en el que el mensaje que se envía tiene un constructor sin parámetros, el kit de herramientas de MVVM tiene una extensión simplificada para enviar un mensaje en este formato.

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

Send<TMessage>(TMessage, object)

La funcionalidad de se puede lograr con el método del Send<TMessage, TToken>(TMessage, TToken) kit de Send<TMessage>(TMessage, object) herramientas de 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)

La funcionalidad de se puede lograr con el método del UnregisterAll(object) kit de Unregister(object) herramientas de MVVM.

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

// MVVM Toolkit
Messenger.UnregisterAll(this);

Unregister<TMessage>(object)

La funcionalidad de se puede lograr con el método Unregister<TMessage>(object)de extensión del IMessenger kit de Unregister<TMessage>(object) herramientas de MVVM.

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

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

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

No hay reemplazo directo para el Unregister<TMessage>(object, Action<TMessage>) método en el kit de herramientas de MVVM.

El motivo de la omisión es que un destinatario del mensaje solo puede tener un único controlador registrado para cualquier tipo de mensaje determinado.

Se recomienda lograr esta funcionalidad con el método Unregister<TMessage>(object)de IMessenger extensión MVVM Toolkit .

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

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

Unregister<TMessage>(object, object)

La funcionalidad de se puede lograr con el método del Unregister<TMessage, TToken>(object, TToken) kit de Unregister<TMessage>(object, object) herramientas de MVVM.

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

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

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

No hay reemplazo directo para el Unregister<TMessage>(object, object, Action<TMessage>) método en el kit de herramientas de MVVM.

El motivo de la omisión es que un destinatario del mensaje solo puede tener un único controlador registrado para cualquier tipo de mensaje determinado.

Se recomienda lograr esta funcionalidad con el método del kit de herramientas de Unregister<TMessage, TToken>(object, TToken) MVVM.

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

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

Cleanup()

El Cleanup método tiene un reemplazo directo con el mismo nombre en el kit de herramientas de MVVM. Tenga en cuenta que este método solo es útil cuando se usa un mensajero que usa referencias débiles, mientras que el StrongReferenceMessenger tipo simplemente no hará nada cuando se llame a este método, ya que el estado interno ya se recorta automáticamente a medida que se usa el mensajero.

// MvvmLight
Messenger.Default.Cleanup();

// MVVM Toolkit
Messenger.Cleanup();

RequestCleanup()

No hay reemplazo directo para el RequestCleanup método en el kit de herramientas de MVVM. En el contexto de MvvmLight, RequestCleanup se usa para iniciar una solicitud para quitar registros que ya no están activos, ya que la implementación aprovecha las referencias débiles.

Las llamadas al RequestCleanup método se pueden quitar o reemplazar por Cleanup.

// MvvmLight
Messenger.Default.RequestCleanup();

// MVVM Toolkit
// No direct replacement, remove

ResetAll()

La funcionalidad de se puede lograr con el método del Reset() kit de ResetAll() herramientas de MVVM.

A diferencia de la implementación de MvvmLight que anula la instancia, el kit de herramientas de MVVM borra los mapas registrados.

// MvvmLight
Messenger.Default.ResetAll();

// MVVM Toolkit
Messenger.Reset();

Métodos estáticos de Messenger

OverrideDefault(IMessenger)

No hay reemplazo directo para el OverrideDefault(IMessenger) método en el kit de herramientas de MVVM.

Para usar una implementación personalizada de IMessenger, registre la implementación personalizada en los registros de servicio para la inserción de dependencias o cree manualmente una instancia estática y pase esto cuando sea necesario.

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

// MVVM Toolkit
// No direct replacement

Reset()

No hay ningún reemplazo directo para el método estático Reset en el kit de herramientas de MVVM.

Se puede lograr la misma funcionalidad llamando al Reset método de la instancia estática Default de uno de los tipos messenger.

// MvvmLight
Messenger.Reset();

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

Propiedades estáticas de Messenger

Default

Default tiene un reemplazo directo, Default, que no requiere ningún cambio en la implementación existente.

// MvvmLight
IMessenger messenger = Messenger.Default;

// MVVM Toolkit
IMessenger messenger = WeakReferenceMessenger.Default;

Migración de tipos de mensajes

Los tipos de mensaje proporcionados en el kit de herramientas de MvvmLight están diseñados como base para que usted como desarrollador trabaje con si es necesario.

Aunque el kit de herramientas de MVVM proporciona algunas alternativas, no hay ningún reemplazo directo para estos tipos de mensajes. Se recomienda examinar los tipos de mensajes disponibles.

Como alternativa, si la solución aprovecha los tipos de mensajes MvvmLight, estos se pueden migrar fácilmente a su propio código base.

Migración de componentes específicos de la plataforma

En la implementación actual del kit de herramientas de MVVM, no hay reemplazos para componentes específicos de la plataforma que existen en el kit de herramientas de MvvmLight.

Los siguientes componentes y sus métodos auxiliares o de extensión asociados no tienen un reemplazo y tendrán que tener en cuenta al migrar al kit de herramientas de MVVM.

Android/iOS/Windows específico

  • DialogService
  • DispatcherHelper
  • NavigationService

Específico de Android/iOS

  • ActivityBase
  • Binding
  • BindingMode
  • PropertyChangedEventManager
  • UpdateTriggerMode

Específico de Android

  • CachingViewHolder
  • ObservableAdapter
  • ObservableRecyclerAdapter

iOS específico

  • ObservableCollectionViewSource
  • ObservableTableViewController
  • ObservableTableViewSource

Helpers

  • Empty
  • WeakAction
  • WeakFunc