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 SimpleIoc
de 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