Migrazione da MvvmLight
Questo articolo illustra alcune delle differenze principali tra MvvmLight Toolkit e MVVM Toolkit per semplificare la migrazione.
Anche se questo articolo è incentrato in modo specifico sulle migrazioni da MvvmLight a MVVM Toolkit, si noti che sono stati apportati miglioramenti aggiuntivi all'interno di MVVM Toolkit, quindi è consigliabile esaminare la documentazione per le singole API.
API della piattaforma:
ObservableObject
,ObservableRecipient
,RelayCommand
,RelayCommand<T>
,AsyncRelayCommand
,AsyncRelayCommand<T>
, ,MessageHandler<TRecipient, TMessage>
IMessenger
WeakReferenceMessenger
StrongReferenceMessenger
IRecipient<TMessage>
IMessengerExtensions
Installazione di MVVM Toolkit
Per sfruttare i vantaggi di MVVM Toolkit, è prima necessario installare il pacchetto NuGet più recente nell'applicazione .NET esistente.
Eseguire l'installazione tramite l'interfaccia della riga di comando di .NET
dotnet add package CommunityToolkit.Mvvm --version 8.1.0
Eseguire l'installazione tramite PackageReference
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.1.0" />
Migrazione di ObservableObject
I passaggi seguenti sono incentrati sulla migrazione dei componenti esistenti che sfruttano mvvmLight ObservableObject
Toolkit. MVVM Toolkit fornisce un ObservableObject
tipo simile.
La prima modifica in questo caso verrà scambiata usando le direttive nei componenti.
// MvvmLight
using GalaSoft.MvvmLight;
// MVVM Toolkit
using CommunityToolkit.Mvvm.ComponentModel;
Di seguito è riportato un elenco di migrazioni che dovranno essere eseguite se usate nella soluzione corrente.
Metodi ObservableObject
Set<T>(Expression, ref T, T)
Set(Expression, ref T, T)
non dispone di una sostituzione della firma del metodo di tipo like.does not have a like-for-like method signature replacement.
Tuttavia, SetProperty(ref T, T, string)
offre le stesse funzionalità con vantaggi aggiuntivi in termini di prestazioni.
// MvvmLight
Set(() => MyProperty, ref this.myProperty, value);
// MVVM Toolkit
SetProperty(ref this.myProperty, value);
Si noti che il string
parametro non è obbligatorio se il metodo viene chiamato dal setter della proprietà, come viene dedotto dal nome del membro chiamante, come si può vedere qui. Se si desidera richiamare SetProperty
per una proprietà diversa da quella in cui viene richiamato il metodo, è possibile farlo usando l'operatore nameof
, che può essere utile per rendere il codice meno soggetto a errori non avendo nomi hardcoded. Ad esempio:
SetProperty(ref this.someProperty, value, nameof(SomeProperty));
Set<T>(string, ref T, T)
Set<T>(string, ref T, T)
non dispone di una sostituzione della firma del metodo di tipo like.does not have a like-for-like method signature replacement.
Fornisce tuttavia SetProperty<T>(ref T, T, string)
la stessa funzionalità con parametri riordinati.
// 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)
ha una sostituzione diretta rinominata, 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)
ha una sostituzione diretta rinominata, OnPropertyChanged(string)
.
// MvvmLight
RaisePropertyChanged(nameof(MyProperty));
// MVVM Toolkit
OnPropertyChanged();
Come con SetProperty
, il nome della proprietà corrente viene dedotto automaticamente dal OnPropertyChanged
metodo . Se si desidera utilizzare questo metodo per generare manualmente l'evento PropertyChanged
per un'altra proprietà, è anche possibile specificare manualmente il nome di tale proprietà usando di nuovo l'operatore nameof
. Ad esempio:
OnPropertyChanged(nameof(SomeProperty));
RaisePropertyChanged<T>(Expression)
RaisePropertyChanged<T>(Expression)
non ha una sostituzione diretta.
È consigliabile migliorare le prestazioni sostituendo RaisePropertyChanged<T>(Expression)
con la parola chiave del Toolkit OnPropertyChanged(string)
usando invece la nameof
parola chiave (o senza parametri, se la proprietà di destinazione è uguale a quella che chiama il metodo, in modo che il nome possa essere dedotto automaticamente come indicato in precedenza).
// MvvmLight
RaisePropertyChanged(() => MyProperty);
// MVVM Toolkit
OnPropertyChanged(nameof(MyProperty));
VerifyPropertyName(string)
Non esiste alcuna sostituzione diretta per il VerifyPropertyName(string)
metodo e qualsiasi codice che usa questa operazione deve essere modificato o rimosso.
Il motivo dell'omissione di MVVM Toolkit è che l'uso della nameof
parola chiave per una proprietà verifica che esista. Al momento della compilazione di MvvmLight, la nameof
parola chiave non era disponibile e questo metodo è stato usato per assicurarsi che la proprietà esista nell'oggetto .
// MvvmLight
VerifyPropertyName(nameof(MyProperty));
// MVVM Toolkit
// No direct replacement, remove
Proprietà ObservableObject
PropertyChangedHandler
PropertyChangedHandler
non ha una sostituzione diretta.
Per generare un evento modificato di proprietà tramite il PropertyChanged
gestore eventi, è invece necessario chiamare il OnPropertyChanged
metodo .
// MvvmLight
PropertyChangedEventHandler handler = PropertyChangedHandler;
// MVVM Toolkit
OnPropertyChanged();
Migrazione di ViewModelBase
I passaggi seguenti sono incentrati sulla migrazione dei componenti esistenti che sfruttano mvvmLight ViewModelBase
Toolkit.
MVVM Toolkit fornisce un ObservableRecipient
tipo che fornisce funzionalità simili.
Di seguito è riportato un elenco di migrazioni che dovranno essere eseguite se usate nella soluzione corrente.
Metodi ViewModelBase
Set<T>(string, ref T, T, bool)
Set<T>(string, ref T, T, bool)
non dispone di una sostituzione della firma del metodo di tipo like.does not have a like-for-like method signature replacement.
Fornisce tuttavia SetProperty<T>(ref T, T, bool, string)
la stessa funzionalità con parametri riordinati.
// MvvmLight
Set(nameof(MyProperty), ref this.myProperty, value, true);
// MVVM Toolkit
SetProperty(ref this.myProperty, value, true);
Si noti che il valore e i parametri booleani broadcast non sono facoltativi nell'implementazione di MVVM Toolkit e devono essere forniti per usare questo metodo. Il motivo di questa modifica è che omettendo il parametro broadcast quando si chiama questo metodo, per impostazione predefinita chiamerà il metodo ObservableObject SetProperty
.
Inoltre, il string
parametro non è obbligatorio se il metodo viene chiamato dal setter della proprietà come viene dedotto dal nome del membro chiamante, proprio come con i metodi nella classe base ObservableObject
.
Set<T>(ref T, T, bool, string)
Set<T>(ref T, T, bool, string)
ha una sostituzione diretta rinominata, 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)
non ha una sostituzione diretta.
Per migliorare le prestazioni, è consigliabile sostituirlo con MVVM Toolkit SetProperty<T>(ref T, T, bool, string)
usando invece la nameof
parola chiave .
// 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)
ha una sostituzione diretta che non richiede una ridenominazione.
// MvvmLight
Broadcast<MyObject>(oldValue, newValue, nameof(MyProperty));
// MVVM Toolkit
Broadcast(oldValue, newValue, nameof(MyProperty));
Si noti che il messaggio inviato tramite la Messenger
proprietà quando si chiama il Broadcast
metodo ha una sostituzione diretta per PropertyChangedMessage
all'interno della libreria MVVM Toolkit.
RaisePropertyChanged<T>(string, T, T, bool)
Non esiste alcuna sostituzione diretta per il RaisePropertyChanged<T>(string, T, T, bool)
metodo .
L'alternativa più semplice consiste nel chiamare e successivamente chiamare OnPropertyChanged
Broadcast
per ottenere questa funzionalità.
// MvvmLight
RaisePropertyChanged<MyObject>(nameof(MyProperty), oldValue, newValue, true);
// MVVM Toolkit
OnPropertyChanged();
Broadcast(oldValue, newValue, nameof(MyProperty));
RaisePropertyChanged<T>(Expression, T, T, bool)
Non esiste alcuna sostituzione diretta per il RaisePropertyChanged<T>(Expression, T, T, bool)
metodo .
L'alternativa più semplice consiste nel chiamare e successivamente chiamare OnPropertyChanged
Broadcast
per ottenere questa funzionalità.
// MvvmLight
RaisePropertyChanged<MyObject>(() => MyProperty, oldValue, newValue, true);
// MVVM Toolkit
OnPropertyChanged(nameof(MyProperty));
Broadcast(oldValue, newValue, nameof(MyProperty));
ICleanup.Cleanup()
Non esiste alcuna sostituzione diretta per l'interfaccia ICleanup
.
Tuttavia, ObservableRecipient
fornisce un OnDeactivated
metodo che deve essere usato per fornire la stessa funzionalità di Cleanup
.
OnDeactivated
in MVVM Toolkit annulla anche la registrazione di tutti gli eventi di messenger registrati quando viene chiamato.
// MvvmLight
Cleanup();
// MVVM Toolkit
OnDeactivated();
Si noti che i OnActivated
metodi e OnDeactivated
possono essere chiamati dalla soluzione esistente come con Cleanup
.
Tuttavia, ObservableRecipient
espone una IsActive
proprietà che controlla anche la chiamata a questi metodi quando è impostata.
Proprietà ViewModelBase
MessengerInstance
MessengerInstance
ha una sostituzione diretta rinominata, Messenger
.
// MvvmLight
IMessenger messenger = MessengerInstance;
// MVVM Toolkit
IMessenger messenger = Messenger;
Nota
Il valore predefinito della Messenger
proprietà sarà l'istanza WeakReferenceMessenger.Default
di , ovvero l'implementazione standard di reference messenger debole in MVVM Toolkit. Questa operazione può essere personalizzata semplicemente inserendo un'istanza diversa IMessenger
nel ObservableRecipient
costruttore.
IsInDesignMode
Non vi è alcuna sostituzione diretta per la IsInDesignMode
proprietà e qualsiasi codice che usa questa operazione deve essere modificato o rimosso.
Il motivo dell'omissione di MVVM Toolkit è che la IsInDesignMode
proprietà espone implementazioni specifiche della piattaforma. MVVM Toolkit è stato progettato per essere indipendente dalla piattaforma.
// MvvmLight
var isInDesignMode = IsInDesignMode;
// MVVM Toolkit
// No direct replacement, remove
Proprietà statiche ViewModelBase
IsInDesignModeStatic
Non vi è alcuna sostituzione diretta per la IsInDesignModeStatic
proprietà e qualsiasi codice che usa questa operazione deve essere modificato o rimosso.
Il motivo dell'omissione di MVVM Toolkit è che la IsInDesignMode
proprietà espone implementazioni specifiche della piattaforma. MVVM Toolkit è stato progettato per essere indipendente dalla piattaforma.
// MvvmLight
var isInDesignMode = ViewModelBase.IsInDesignModeStatic;
// MVVM Toolkit
// No direct replacement, remove
Migrazione di RelayCommand
I passaggi seguenti sono incentrati sulla migrazione dei componenti esistenti che sfruttano mvvmLight RelayCommand
Toolkit.
MVVM Toolkit fornisce un RelayCommand
tipo che fornisce funzionalità simili a quella che sfruttano l'interfaccia ICommand
di sistema.
Di seguito è riportato un elenco di migrazioni che dovranno essere eseguite se usate nella soluzione corrente. Se non è elencato un metodo o una proprietà, esiste una sostituzione diretta con lo stesso nome in MVVM Toolkit e non è necessaria alcuna modifica.
La prima modifica in questo caso verrà scambiata usando le direttive nei componenti.
// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;
Nota
MvvmLight usa riferimenti deboli per stabilire il collegamento tra il comando e l'azione chiamata dalla classe associata. Questa operazione non è richiesta dall'implementazione di MVVM Toolkit e, se questo parametro facoltativo è stato impostato su true
in uno dei costruttori, questo verrà rimosso.
Uso di RelayCommand con azioni asincrone
Se attualmente si usa l'implementazione di MvvmLight RelayCommand
con azioni asincrone, MVVM Toolkit espone un'implementazione migliorata per questi scenari.
È sufficiente sostituire il esistente RelayCommand
con l'oggetto AsyncRelayCommand
creato per scopi asincroni.
// MvvmLight
var command = new RelayCommand(() => OnCommandAsync());
var command = new RelayCommand(async () => await OnCommandAsync());
// MVVM Toolkit
var asyncCommand = new AsyncRelayCommand(OnCommandAsync);
Metodi RelayCommand
RaiseCanExecuteChanged()
La funzionalità di RaiseCanExecuteChanged()
può essere ottenuta con il metodo di NotifyCanExecuteChanged()
MVVM Toolkit.
// MvvmLight
var command = new RelayCommand(OnCommand);
command.RaiseCanExecuteChanged();
// MVVM Toolkit
var command = new RelayCommand(OnCommand);
command.NotifyCanExecuteChanged();
Migrazione RelayCommand<T>
I passaggi seguenti sono incentrati sulla migrazione dei componenti esistenti che sfruttano mvvmLight RelayCommand<T>
Toolkit.
MVVM Toolkit fornisce un RelayCommand<T>
tipo che fornisce funzionalità simili a quella che sfruttano l'interfaccia ICommand
di sistema.
Di seguito è riportato un elenco di migrazioni che dovranno essere eseguite se usate nella soluzione corrente. Se non è elencato un metodo o una proprietà, esiste una sostituzione diretta con lo stesso nome in MVVM Toolkit e non è necessaria alcuna modifica.
La prima modifica in questo caso verrà scambiata usando le direttive nei componenti.
// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;
Uso con RelayCommand
azioni asincrone
Se attualmente si usa l'implementazione di MvvmLight RelayCommand<T>
con azioni asincrone, MVVM Toolkit espone un'implementazione migliorata per questi scenari.
È sufficiente sostituire il esistente RelayCommand<T>
con l'oggetto AsyncRelayCommand<T>
creato per scopi asincroni.
// MvvmLight
var command = new RelayCommand<string>(async () => await OnCommandAsync());
// MVVM Toolkit
var asyncCommand = new AsyncRelayCommand<string>(OnCommandAsync);
RelayCommand<T>
Metodi
RaiseCanExecuteChanged()
La funzionalità di RaiseCanExecuteChanged()
può essere ottenuta con il metodo di NotifyCanExecuteChanged()
MVVM Toolkit.
// MvvmLight
var command = new RelayCommand<string>(OnCommand);
command.RaiseCanExecuteChanged();
// MVVM Toolkit
var command = new RelayCommand<string>(OnCommand);
command.NotifyCanExecuteChanged();
Migrazione SimpleIoc
L'implementazione IoC in MVVM Toolkit non include alcuna logica predefinita per gestire autonomamente l'inserimento delle dipendenze, quindi è possibile usare qualsiasi libreria di terze parti per recuperare un'istanza IServiceProvider
che è quindi possibile passare al Ioc.ConfigureServices
metodo. Negli esempi seguenti verrà usato il ServiceCollection
tipo della Microsoft.Extensions.DependencyInjection
libreria.
Questo è il cambiamento più importante tra MvvmLight e MVVM Toolkit.
Questa implementazione avrà familiarità se è stata implementata l'inserimento delle dipendenze con applicazioni ASP.NET Core.
Registrazione delle dipendenze
Con MvvmLight, è possibile che le dipendenze siano state registrate in modo simile a questi scenari usando SimpleIoc
.
public void RegisterServices()
{
SimpleIoc.Default.Register<INavigationService, NavigationService>();
SimpleIoc.Default.Register<IDialogService>(() => new DialogService());
}
Con MVVM Toolkit, si otterrebbe lo stesso risultato del seguente.
public void RegisterServices()
{
Ioc.Default.ConfigureServices(
new ServiceCollection()
.AddSingleton<INavigationService, NavigationService>()
.AddSingleton<IDialogService>(new DialogService())
.BuildServiceProvider());
}
Risoluzione delle dipendenze
Dopo l'inizializzazione Ioc
, i servizi possono essere recuperati dalla classe esattamente come con SimpleIoc
:
IDialogService dialogService = SimpleIoc.Default.GetInstance<IDialogService>();
La migrazione a MVVM Toolkit consente di ottenere lo stesso risultato con:
IDialogService dialogService = Ioc.Default.GetService<IDialogService>();
Rimozione delle dipendenze
Con SimpleIoc
, annullare la registrazione delle dipendenze con la chiamata al metodo seguente.
SimpleIoc.Default.Unregister<INavigationService>();
Non esiste alcuna sostituzione diretta per la rimozione delle dipendenze con l'implementazione di MVVM Toolkit Ioc
.
Costruttore preferito
Quando si registrano le dipendenze con MvvmLight, SimpleIoc
è possibile usare le classi per fornire un PreferredConstructor
attributo per quelli con più costruttori.
Questo attributo dovrà rimuovere dove viene usato e sarà necessario usare qualsiasi attributo della libreria di inserimento delle dipendenze di terze parti, se supportato.
Migrazione Messenger
I passaggi seguenti sono incentrati sulla migrazione dei componenti esistenti che sfruttano mvvmLight Messenger
Toolkit.
MVVM Toolkit fornisce due implementazioni di messenger (WeakReferenceMessenger
e StrongReferenceMessenger
, vedere la documentazione qui) che fornisce funzionalità simili, con alcune differenze chiave descritte di seguito.
Di seguito è riportato un elenco di migrazioni che dovranno essere eseguite se usate nella soluzione corrente.
La prima modifica in questo caso verrà scambiata usando le direttive nei componenti.
// MvvmLight
using GalaSoft.MvvmLight.Messaging;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Messaging;
Metodi di Messenger
Register<TMessage>(object, Action<TMessage>)
La funzionalità di Register<TMessage>(object, Action<TMessage>)
può essere ottenuta con il metodo Register<TRecipient, TMessage>(object, MessageHandler<TRecipient, TMessage>)
di estensione di IMessenger
MVVM Toolkit .
// MvvmLight
Messenger.Default.Register<MyMessage>(this, this.OnMyMessageReceived);
// MVVM Toolkit
Messenger.Register<MyViewModel, MyMessage>(this, static (r, m) => r.OnMyMessageReceived(m));
Il motivo di questa firma è che consente al messaggero di utilizzare riferimenti deboli per tenere traccia correttamente dei destinatari e di evitare di creare chiuse per acquisire il destinatario stesso. Ovvero, il destinatario di input viene passato come input all'espressione lambda, quindi non deve essere acquisito dall'espressione lambda stessa. Ciò comporta anche codice più efficiente, poiché lo stesso gestore può essere riutilizzato più volte senza allocazioni. Si noti che questo è solo uno dei modi supportati per registrare i gestori ed è anche possibile usare l'interfaccia IRecipient<TMessage>
(dettagliata nella documentazione messenger), che rende la registrazione automatica e meno dettagliata.
Nota
Il static
modificatore per le espressioni lambda richiede C# 9 ed è facoltativo. È utile usarlo qui per assicurarsi di non acquisire accidentalmente il destinatario o un altro membro, causando quindi l'allocazione di una chiusura, ma non è obbligatorio. Se non è possibile usare C# 9, è sufficiente rimuovere static
qui e prestare attenzione per assicurarsi che il codice non acquisisca nulla.
Inoltre, questo esempio e quelli seguenti usano solo la Messenger
proprietà da ObservableRecipient
. Se si vuole solo accedere in modo statico a un'istanza di Messenger da qualsiasi altra parte del codice, si applicano anche gli stessi esempi, con l'unica differenza che Messenger
deve essere sostituita con es. WeakReferenceMessenger.Default
Invece.
Register<TMessage>(object, bool, Action<TMessage>)
Non esiste alcuna sostituzione diretta per questo meccanismo di registrazione che consente di supportare anche la ricezione di messaggi per i tipi di messaggi derivati. Questa modifica è intenzionale perché l'implementazione mira a non usare la Messenger
reflection per ottenere i vantaggi in termini di prestazioni.
In alternativa, sono disponibili alcune opzioni che è possibile eseguire per ottenere questa funzionalità.
- Creare un'implementazione personalizzata
IMessenger
. - Registrare i tipi di messaggio aggiuntivi usando un gestore condiviso, quindi controlla il tipo e richiama il metodo corretto.
// 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 funzionalità di Register<TMessage>(object, object, Action<TMessage>)
può essere ottenuta con il metodo di Register<TRecipient, TMessage, TToken>(object, TToken, MessageHandler<TRecipient, TMessage>)
MVVM Toolkit.
// 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>)
Non esiste alcuna sostituzione diretta per questo meccanismo di registrazione che consente di supportare anche la ricezione di messaggi per i tipi di messaggi derivati. Questa modifica è intenzionale perché l'implementazione mira a non usare la Messenger
reflection per ottenere i vantaggi in termini di prestazioni.
In alternativa, sono disponibili alcune opzioni che è possibile eseguire per ottenere questa funzionalità.
- Creare un'implementazione personalizzata
IMessenger
. - Registrare i tipi di messaggio aggiuntivi usando un gestore condiviso, quindi controlla il tipo e richiama il metodo corretto.
// 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 funzionalità di Send<TMessage>(TMessage)
può essere ottenuta con il metodo Send<TMessage>(TMessage)
di estensione di IMessenger
MVVM Toolkit .
// MvvmLight
Messenger.Default.Send<MyMessage>(new MyMessage());
Messenger.Default.Send(new MyMessage());
// MVVM Toolkit
Messenger.Send(new MyMessage());
Nello scenario precedente in cui il messaggio inviato ha un costruttore senza parametri, MVVM Toolkit ha un'estensione semplificata per inviare un messaggio in questo formato.
// MVVM Toolkit
Messenger.Send<MyMessage>();
Send<TMessage>(TMessage, object)
La funzionalità di Send<TMessage>(TMessage, object)
può essere ottenuta con il metodo di Send<TMessage, TToken>(TMessage, TToken)
MVVM Toolkit.
// 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 funzionalità di Unregister(object)
può essere ottenuta con il metodo di UnregisterAll(object)
MVVM Toolkit.
// MvvmLight
Messenger.Default.Unregister(this);
// MVVM Toolkit
Messenger.UnregisterAll(this);
Unregister<TMessage>(object)
La funzionalità di Unregister<TMessage>(object)
può essere ottenuta con il metodo Unregister<TMessage>(object)
di estensione di IMessenger
MVVM Toolkit .
// MvvmLight
Messenger.Default.Unregister<MyMessage>(this);
// MVVM Toolkit
Messenger.Unregister<MyMessage>(this);
Unregister<TMessage>(object, Action<TMessage>)
Non esiste alcuna sostituzione diretta per il Unregister<TMessage>(object, Action<TMessage>)
metodo in MVVM Toolkit.
Il motivo dell'omissione è che un destinatario del messaggio può avere un solo gestore registrato per qualsiasi tipo di messaggio specificato.
È consigliabile ottenere questa funzionalità con il metodo Unregister<TMessage>(object)
di estensione di IMessenger
MVVM Toolkit.
// MvvmLight
Messenger.Default.Unregister<MyMessage>(this, OnMyMessageReceived);
// MVVM Toolkit
Messenger.Unregister<MyMessage>(this);
Unregister<TMessage>(object, object)
La funzionalità di Unregister<TMessage>(object, object)
può essere ottenuta con il metodo di Unregister<TMessage, TToken>(object, TToken)
MVVM Toolkit.
// MvvmLight
Messenger.Default.Unregister<MyMessage>(this, nameof(MyViewModel));
// MVVM Toolkit
Messenger.Unregister<MyMessage, string>(this, nameof(MyViewModel));
Unregister<TMessage>(object, object, Action<TMessage>)
Non esiste alcuna sostituzione diretta per il Unregister<TMessage>(object, object, Action<TMessage>)
metodo in MVVM Toolkit.
Il motivo dell'omissione è che un destinatario del messaggio può avere un solo gestore registrato per qualsiasi tipo di messaggio specificato.
È consigliabile ottenere questa funzionalità con il metodo di Unregister<TMessage, TToken>(object, TToken)
MVVM Toolkit.
// MvvmLight
Messenger.Default.Unregister<MyMessage>(this, nameof(MyViewModel), OnMyMessageReceived);
// MVVM Toolkit
Messenger.Unregister<MyMessage, string>(this, nameof(MyViewModel));
Cleanup()
Il Cleanup
metodo ha una sostituzione diretta con lo stesso nome in MVVM Toolkit. Si noti che questo metodo è utile solo quando viene usato un messenger che usa riferimenti deboli, mentre il StrongReferenceMessenger
tipo non esegue semplicemente alcuna operazione quando questo metodo viene chiamato, poiché lo stato interno viene già tagliato automaticamente mentre viene usato messenger.
// MvvmLight
Messenger.Default.Cleanup();
// MVVM Toolkit
Messenger.Cleanup();
RequestCleanup()
Non esiste alcuna sostituzione diretta per il RequestCleanup
metodo in MVVM Toolkit. Nel contesto di MvvmLight, RequestCleanup
viene usato per avviare una richiesta di rimozione delle registrazioni che non sono più attive perché l'implementazione sfrutta i riferimenti deboli.
Tutte le chiamate al RequestCleanup
metodo possono essere rimosse o sostituite con Cleanup
.
// MvvmLight
Messenger.Default.RequestCleanup();
// MVVM Toolkit
// No direct replacement, remove
ResetAll()
La funzionalità di ResetAll()
può essere ottenuta con il metodo di Reset()
MVVM Toolkit.
A differenza dell'implementazione di MvvmLight che annulla l'istanza, MVVM Toolkit cancella le mappe registrate.
// MvvmLight
Messenger.Default.ResetAll();
// MVVM Toolkit
Messenger.Reset();
Metodi statici di Messenger
OverrideDefault(IMessenger)
Non esiste alcuna sostituzione diretta per il OverrideDefault(IMessenger)
metodo in MVVM Toolkit.
Per usare un'implementazione personalizzata di IMessenger
, registrare l'implementazione personalizzata nelle registrazioni del servizio per l'inserimento delle dipendenze o costruire manualmente un'istanza statica e passarla dove necessario.
// MvvmLight
Messenger.OverrideDefault(new Messenger());
// MVVM Toolkit
// No direct replacement
Reset()
Non esiste alcuna sostituzione diretta per il metodo statico Reset
in MVVM Toolkit.
La stessa funzionalità può essere ottenuta chiamando il Reset
metodo dell'istanza statica Default
di uno dei tipi messenger.
// MvvmLight
Messenger.Reset();
// MVVM Toolkit
WeakReferenceMessenger.Default.Reset();
Proprietà statiche di Messenger
Default
Default
ha una sostituzione diretta, Default
, che non richiede alcuna modifica all'implementazione esistente.
// MvvmLight
IMessenger messenger = Messenger.Default;
// MVVM Toolkit
IMessenger messenger = WeakReferenceMessenger.Default;
Migrazione dei tipi di messaggio
I tipi di messaggio forniti nel toolkit MvvmLight sono progettati come base per gli sviluppatori, se necessario.
Sebbene MVVM Toolkit fornisca alcune alternative, non esistono sostituzioni dirette per questi tipi di messaggio. È consigliabile esaminare i tipi di messaggio disponibili.
In alternativa, se la soluzione sfrutta i tipi di messaggio MvvmLight, è possibile convertirli facilmente nella propria codebase.
Migrazione di componenti specifici della piattaforma
Nell'implementazione corrente di MVVM Toolkit non esistono sostituzioni per i componenti specifici della piattaforma presenti nel toolkit MvvmLight.
I componenti seguenti e i relativi metodi helper/estensioni associati non hanno una sostituzione e dovranno prendere in considerazione quando si esegue la migrazione a MVVM Toolkit.
Android/iOS/Windows specifico
DialogService
DispatcherHelper
NavigationService
Specifico di Android/iOS
ActivityBase
Binding
BindingMode
PropertyChangedEventManager
UpdateTriggerMode
Android specifico
CachingViewHolder
ObservableAdapter
ObservableRecyclerAdapter
Specifico di iOS
ObservableCollectionViewSource
ObservableTableViewController
ObservableTableViewSource
Helper
Empty
WeakAction
WeakFunc