Compartir a través de


Migración desde MvvmLight

En este artículo se describen algunas de las principales diferencias entre el kit de herramientas MvvmLight y el kit de herramientas de MVVM a la hora de 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 la plataforma:ObservableObject, ObservableRecipient, RelayCommand, RelayCommand<T>, AsyncRelayCommand, AsyncRelayCommand<T>, IMessenger, WeakReferenceMessenger, 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 .NET existente.

Instalación mediante la CLI de .NET

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 las ventajas de ObservableObject del kit de herramientas de MvvmLight. El kit de herramientas de MVVM proporciona un tipo de ObservableObject similar.

El primer cambio aquí será intercambiar el uso de directivas 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 parámetro string no es necesario si se llama al método desde el establecedor de la propiedad, ya que se deduce del nombre del miembro llamador, tal y como se puede ver aquí. Si desea invocar SetProperty para una propiedad diferente de la cuyo método se invoca, puede hacerlo mediante el operador nameof, lo que puede resultar útil para que el código sea menos propenso a errores al no tener 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 se 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 se ha cambiado, OnPropertyChanged(string).

// MvvmLight
RaisePropertyChanged(nameof(MyProperty));

// MVVM Toolkit
OnPropertyChanged();

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

OnPropertyChanged(nameof(SomeProperty));

RaisePropertyChanged<T>(Expression)

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

Para mejorar el rendimiento, se recomienda que reemplace RaisePropertyChanged<T>(Expression) por OnPropertyChanged(string) del kit de herramientas mediante la palabra clave nameof 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 tal y como se mencionó antes).

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

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

VerifyPropertyName(string)

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

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

// MvvmLight
VerifyPropertyName(nameof(MyProperty));

// MVVM Toolkit
// No direct replacement, remove

Propiedades de ObservableObject

PropertyChangedHandler

PropertyChangedHandler no tiene un reemplazo directo.

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

// MvvmLight
PropertyChangedEventHandler handler = PropertyChangedHandler;

// MVVM Toolkit
OnPropertyChanged();

Migrando ViewModelBase

Los pasos siguientes se centran en migrar los componentes existentes que aprovechan las ventajas de ViewModelBase del kit de herramientas de MvvmLight.

El kit de herramientas de MVVM proporciona un tipo ObservableRecipient que brinda 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 deben proporcionarse 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, se llamará de forma predeterminada al método SetProperty de ObservableObject.

Tenga también en cuenta que el parámetro string no es necesario si se llama al método desde el establecedor de la propiedad, ya que se deduce del nombre del miembro llamador,como en los métodos en la base de la clase ObservableObject.

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

Set<T>(ref T, T, bool, string) tiene un reemplazo directo cuyo nombre se 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 SetProperty<T>(ref T, T, bool, string) del kit de herramientas de MVVM mediante la palabra clave nameof 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 propiedad Messenger al llamar al método Broadcast tiene un reemplazo directo para PropertyChangedMessage dentro de la biblioteca del kit de herramientas MVVM.

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

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

La alternativa más sencilla es llamar a OnPropertyChanged y, posteriormente, llamar a Broadcast para obtener 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 ningún reemplazo directo para el método RaisePropertyChanged<T>(Expression, T, T, bool).

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

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

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

ICleanup.Cleanup()

No hay ningún reemplazo directo para la interfaz ICleanup.

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

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

// MvvmLight
Cleanup();

// MVVM Toolkit
OnDeactivated();

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

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

Propiedades de ViewModelBase

MessengerInstance

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

// MvvmLight
IMessenger messenger = MessengerInstance;

// MVVM Toolkit
IMessenger messenger = Messenger;

Nota:

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

IsInDesignMode

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

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

// MvvmLight
var isInDesignMode = IsInDesignMode;

// MVVM Toolkit
// No direct replacement, remove

Propiedades estáticas de ViewModelBase

IsInDesignModeStatic

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

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

// 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 las ventajas de RelayCommand del kit de herramientas de MvvmLight.

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

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 el uso de directivas en los componentes.

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

// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;

Nota:

MvvmLight usa referencias parciales 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 como true 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 RelayCommand existente 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 RaiseCanExecuteChanged() se puede lograr con el método NotifyCanExecuteChanged() del kit de herramientas MVVM.

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

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

Migración de RelayCommand<T>

Los pasos siguientes se centran en migrar los componentes existentes que aprovechan las ventajas de RelayCommand<T> del kit de herramientas de MvvmLight.

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

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 el uso de directivas en los componentes.

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

// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;

Uso de RelayCommand con comandos asincrónicos

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 RelayCommand<T> existente 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 RaiseCanExecuteChanged() se puede lograr con el método NotifyCanExecuteChanged() del kit de herramientas MVVM.

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

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

Migración de SimpleIoc

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

Este es el mayor cambio entre MvvmLight y el kit de herramientas de MVVM.

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

Registro de 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 clase Ioc igual que con SimpleIoc:

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

Al migrar al kit de herramientas de MVVM, logrará lo mismo con:

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

Eliminar dependencias

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

SimpleIoc.Default.Unregister<INavigationService>();

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

Constructor preferido

Al registrar las dependencias con SimpleIocde MvvmLight, puede optar por recibir clases para proporcionar un atributo PreferredConstructor para aquellos con varios constructores.

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

Migración de Messenger

Los pasos siguientes se centran en migrar los componentes existentes que aprovechan las ventajas de Messenger del kit de herramientas de MvvmLight.

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 el uso de directivas 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 Register<TMessage>(object, Action<TMessage>) se puede lograr con el método IMessenger del kit de herramientas MVVMRegister<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));

La razón de esta firma es que permite a messenger usar referencias parciales 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 para registrar controladores, y también es posible usar la interfaz IRecipient<TMessage> en su lugar (detalles en los documentos de messenger), lo que hace que el registro sea automático y menos detallado.

Nota:

El modificador static 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 provocando la asignación de un cierre, pero no es obligatorio. Si no puede usar C# 9, solo tiene que quitar 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 propiedad Messenger de ObservableRecipient. Si desea acceder de forma estática a una instancia de Messenger desde cualquier otro lugar del código, también se aplican los mismos ejemplos, con la única diferencia de 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 permita admitir también la recepción de mensajes para los tipos de mensajes derivados. Este cambio es intencionado, ya que la implementación de Messenger tiene como objetivo no usar la reflexión para lograr las ventajas de rendimiento.

Como alternativa, hay algunas opciones que se pueden llevar a cabo para lograr esta funcionalidad.

  • Crear una implementación IMessenger personalizada.
  • Registre los tipos de mensaje adicionales mediante un controlador compartido que 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 Register<TMessage>(object, object, Action<TMessage>) se puede lograr con el método Register<TRecipient, TMessage, TToken>(object, TToken, MessageHandler<TRecipient, TMessage>) del kit de herramientas 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 permita admitir también la recepción de mensajes para los tipos de mensajes derivados. Este cambio es intencionado, ya que la implementación de Messenger tiene como objetivo no usar la reflexión para lograr las ventajas de rendimiento.

Como alternativa, hay algunas opciones que se pueden llevar a cabo para lograr esta funcionalidad.

  • Crear una implementación IMessenger personalizada.
  • Registre los tipos de mensaje adicionales mediante un controlador compartido que 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 Send<TMessage>(TMessage) se puede lograr con el método de extensión Send<TMessage>(TMessage) del kit de herramientas MVVM IMessenger.

// 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 Send<TMessage>(TMessage, object) se puede lograr con el método Send<TMessage, TToken>(TMessage, TToken) del kit de herramientas 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 Unregister(object) se puede lograr con el método UnregisterAll(object) del kit de herramientas MVVM.

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

// MVVM Toolkit
Messenger.UnregisterAll(this);

Unregister<TMessage>(object)

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

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

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

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

No hay ningún reemplazo directo para el método Unregister<TMessage>(object, Action<TMessage>) en el kit de herramientas 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 de extensión Unregister<TMessage>(object) del kit de herramientas MVVM IMessenger.

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

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

Unregister<TMessage>(object, object)

La funcionalidad de Unregister<TMessage>(object, object) se puede lograr con el método Unregister<TMessage, TToken>(object, TToken) del kit de herramientas 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 ningún reemplazo directo para el método Unregister<TMessage>(object, object, Action<TMessage>) en el kit de herramientas 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 MVVM Unregister<TMessage, TToken>(object, TToken).

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

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

Cleanup()

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

// MvvmLight
Messenger.Default.Cleanup();

// MVVM Toolkit
Messenger.Cleanup();

RequestCleanup()

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

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

// MvvmLight
Messenger.Default.RequestCleanup();

// MVVM Toolkit
// No direct replacement, remove

ResetAll()

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

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

// MvvmLight
Messenger.Default.ResetAll();

// MVVM Toolkit
Messenger.Reset();

Métodos estáticos de messenger

OverrideDefault(IMessenger)

No hay ningún reemplazo directo para el método OverrideDefault(IMessenger) en el kit de herramientas 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 MVVM.

La misma funcionalidad se puede lograr llamando al método Reset de la instancia Default estática 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 mensaje

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 ellos si es necesario.

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

Como alternativa, si la solución aprovecha los tipos de mensaje 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 existan 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 tenerse en cuenta al migrar al kit de herramientas de MVVM.

Específico de Android/iOS/Windows

  • DialogService
  • DispatcherHelper
  • NavigationService

Específico de Android/iOS

  • ActivityBase
  • Binding
  • BindingMode
  • PropertyChangedEventManager
  • UpdateTriggerMode

Específico de Android

  • CachingViewHolder
  • ObservableAdapter
  • ObservableRecyclerAdapter

Específico de iOS

  • ObservableCollectionViewSource
  • ObservableTableViewController
  • ObservableTableViewSource

Asistentes

  • Empty
  • WeakAction
  • WeakFunc