Migrowanie z mvvmLight
W tym artykule opisano niektóre kluczowe różnice między zestawem narzędzi MvvmLight Toolkit a zestawem narzędzi MVVM w celu ułatwienia migracji.
Chociaż ten artykuł koncentruje się specjalnie na migracjach z mvvmLight do zestawu narzędzi MVVM, należy pamiętać, że istnieją dodatkowe ulepszenia wprowadzone w zestawie narzędzi MVVM Toolkit, dlatego zdecydowanie zalecamy zapoznanie się z dokumentacją poszczególnych nowych interfejsów API.
Interfejsy API platformy:, ,
RelayCommand<T>
AsyncRelayCommand
WeakReferenceMessenger
MessageHandler<TRecipient, TMessage>
RelayCommand
IRecipient<TMessage>
AsyncRelayCommand<T>
StrongReferenceMessenger
IMessenger
ObservableRecipient
ObservableObject
IMessengerExtensions
Instalowanie zestawu narzędzi MVVM Toolkit
Aby skorzystać z zestawu narzędzi MVVM Toolkit, najpierw musisz zainstalować najnowszy pakiet NuGet do istniejącej aplikacji .NET.
Instalowanie za pomocą interfejsu wiersza polecenia platformy .NET
dotnet add package CommunityToolkit.Mvvm --version 8.1.0
Instalowanie za pomocą funkcji PackageReference
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.1.0" />
Migrowanie obiektu obserwowalnego
Poniższe kroki koncentrują się na migrowaniu istniejących składników, które korzystają z ObservableObject
zestawu narzędzi MvvmLight. Zestaw narzędzi MVVM udostępnia ObservableObject
typ podobny.
Pierwsza zmiana w tym miejscu spowoduje zamianę dyrektyw przy użyciu dyrektyw w składnikach.
// MvvmLight
using GalaSoft.MvvmLight;
// MVVM Toolkit
using CommunityToolkit.Mvvm.ComponentModel;
Poniżej znajduje się lista migracji, które należy wykonać, jeśli są używane w bieżącym rozwiązaniu.
Obserwowalne metodyObject
Set<T>(Expression, ref T, T)
Set(Expression, ref T, T)
nie ma zastąpienia sygnatury metody podobnej do podobnych.
Zapewnia SetProperty(ref T, T, string)
jednak te same funkcje z dodatkowymi korzyściami z wydajności.
// MvvmLight
Set(() => MyProperty, ref this.myProperty, value);
// MVVM Toolkit
SetProperty(ref this.myProperty, value);
Należy pamiętać, że string
parametr nie jest wymagany, jeśli metoda jest wywoływana z klasy setter właściwości, ponieważ jest wywnioskowana z nazwy elementu członkowskiego wywołującego, jak widać tutaj. Jeśli chcesz wywołać SetProperty
dla właściwości innej niż wywoływana metoda, możesz to zrobić za pomocą nameof
operatora , co może być przydatne, aby kod był mniej podatny na błędy, nie mając nazw zakodowanych na stałe. Przykład:
SetProperty(ref this.someProperty, value, nameof(SomeProperty));
Set<T>(string, ref T, T)
Set<T>(string, ref T, T)
nie ma zastąpienia sygnatury metody podobnej do podobnych.
Zapewnia SetProperty<T>(ref T, T, string)
jednak te same funkcje z ponownie uporządkowanymi parametrami.
// 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)
ma zmienioną nazwę bezpośredniego zastąpienia, 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)
ma zmienioną nazwę bezpośredniego zastąpienia, OnPropertyChanged(string)
.
// MvvmLight
RaisePropertyChanged(nameof(MyProperty));
// MVVM Toolkit
OnPropertyChanged();
Podobnie jak w przypadku SetProperty
metody , nazwa bieżącej właściwości jest automatycznie wnioskowana przez metodę OnPropertyChanged
. Jeśli chcesz użyć tej metody, aby ręcznie zgłosić PropertyChanged
zdarzenie dla innej właściwości, możesz również ręcznie określić nazwę tej właściwości przy użyciu nameof
operatora ponownie. Przykład:
OnPropertyChanged(nameof(SomeProperty));
RaisePropertyChanged<T>(Expression)
RaisePropertyChanged<T>(Expression)
nie ma bezpośredniego zastąpienia.
Zaleca się, aby poprawić wydajność zastępowaną RaisePropertyChanged<T>(Expression)
przez zestaw narzędzi OnPropertyChanged(string)
przy użyciu słowa kluczowego nameof
(lub bez parametrów, jeśli właściwość docelowa jest taka sama jak właściwość docelowa wywołująca metodę, więc nazwę można wywnioskować automatycznie, jak wspomniano powyżej).
// MvvmLight
RaisePropertyChanged(() => MyProperty);
// MVVM Toolkit
OnPropertyChanged(nameof(MyProperty));
VerifyPropertyName(string)
Nie ma bezpośredniego zastąpienia VerifyPropertyName(string)
metody i każdy kod używający tej metody powinien zostać zmieniony lub usunięty.
Przyczyną pominięcie zestawu narzędzi MVVM Toolkit jest to, że użycie nameof
słowa kluczowego dla właściwości sprawdza, czy istnieje. Gdy element MvvmLight został skompilowany, nameof
słowo kluczowe nie było dostępne i ta metoda została użyta w celu upewnienia się, że właściwość istniała w obiekcie.
// MvvmLight
VerifyPropertyName(nameof(MyProperty));
// MVVM Toolkit
// No direct replacement, remove
Obserwowalne właściwości obiektuObject
PropertyChangedHandler
PropertyChangedHandler
nie ma bezpośredniego zastąpienia.
Aby zgłosić zdarzenie zmiany właściwości za pośrednictwem PropertyChanged
programu obsługi zdarzeń, należy wywołać metodę OnPropertyChanged
.
// MvvmLight
PropertyChangedEventHandler handler = PropertyChangedHandler;
// MVVM Toolkit
OnPropertyChanged();
Migrowanie modelu ViewModelBase
Poniższe kroki koncentrują się na migrowaniu istniejących składników, które korzystają z ViewModelBase
zestawu narzędzi MvvmLight.
Zestaw narzędzi MVVM Udostępnia ObservableRecipient
typ, który zapewnia podobne funkcje.
Poniżej znajduje się lista migracji, które należy wykonać, jeśli są używane w bieżącym rozwiązaniu.
Metody ViewModelBase
Set<T>(string, ref T, T, bool)
Set<T>(string, ref T, T, bool)
nie ma zastąpienia sygnatury metody podobnej do podobnych.
Zapewnia SetProperty<T>(ref T, T, bool, string)
jednak te same funkcje z ponownie uporządkowanymi parametrami.
// MvvmLight
Set(nameof(MyProperty), ref this.myProperty, value, true);
// MVVM Toolkit
SetProperty(ref this.myProperty, value, true);
Należy pamiętać, że wartości i parametry logiczne emisji nie są opcjonalne w implementacji zestawu narzędzi MVVM Toolkit i muszą być podane do użycia tej metody. Przyczyną tej zmiany jest to, że pominięcia parametru emisji podczas wywoływania tej metody domyślnie wywoła metodę ObservableObject SetProperty
.
Ponadto parametr nie jest wymagany, string
jeśli metoda jest wywoływana z klasy bazowej właściwości, ponieważ jest wywnioskowana z nazwy elementu członkowskiego wywołującego, podobnie jak w przypadku metod w klasie bazowej ObservableObject
.
Set<T>(ref T, T, bool, string)
Set<T>(ref T, T, bool, string)
ma zmienioną nazwę bezpośredniego zastąpienia, 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)
nie ma bezpośredniego zastąpienia.
Zaleca się, aby zwiększyć wydajność, zastępując ją zamiast tego słowem nameof
kluczowym zestawu narzędzi MVVM ToolkitSetProperty<T>(ref T, T, bool, string)
.
// 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)
ma bezpośrednie zastąpienie, które nie wymaga zmiany nazwy.
// MvvmLight
Broadcast<MyObject>(oldValue, newValue, nameof(MyProperty));
// MVVM Toolkit
Broadcast(oldValue, newValue, nameof(MyProperty));
Należy pamiętać, że komunikat wysyłany za pośrednictwem Messenger
właściwości podczas wywoływania Broadcast
metody ma bezpośredni zamiennik PropertyChangedMessage
w bibliotece zestawu narzędzi MVVM Toolkit.
RaisePropertyChanged<T>(string, T, T, bool)
Nie ma bezpośredniego zastąpienia RaisePropertyChanged<T>(string, T, T, bool)
metody .
Najprostszą alternatywą jest wywołanie OnPropertyChanged
metody , a następnie wywołanie Broadcast
funkcji w celu osiągnięcia tej funkcji.
// MvvmLight
RaisePropertyChanged<MyObject>(nameof(MyProperty), oldValue, newValue, true);
// MVVM Toolkit
OnPropertyChanged();
Broadcast(oldValue, newValue, nameof(MyProperty));
RaisePropertyChanged<T>(Expression, T, T, bool)
Nie ma bezpośredniego zastąpienia RaisePropertyChanged<T>(Expression, T, T, bool)
metody .
Najprostszą alternatywą jest wywołanie OnPropertyChanged
metody , a następnie wywołanie Broadcast
funkcji w celu osiągnięcia tej funkcji.
// MvvmLight
RaisePropertyChanged<MyObject>(() => MyProperty, oldValue, newValue, true);
// MVVM Toolkit
OnPropertyChanged(nameof(MyProperty));
Broadcast(oldValue, newValue, nameof(MyProperty));
ICleanup.Cleanup()
Nie ma bezpośredniego zastąpienia interfejsu ICleanup
.
Jednak metoda ObservableRecipient
udostępnia metodę OnDeactivated
, która powinna służyć do zapewnienia tej samej funkcjonalności co Cleanup
.
OnDeactivated
w zestawie narzędzi MVVM Również wyrejestruje wszystkie zarejestrowane wydarzenia messengera po wywołaniu.
// MvvmLight
Cleanup();
// MVVM Toolkit
OnDeactivated();
Należy pamiętać, że OnActivated
metody i OnDeactivated
mogą być wywoływane z istniejącego rozwiązania, tak jak w przypadku Cleanup
polecenia .
Jednak właściwość uwidacznia ObservableRecipient
IsActive
właściwość, która kontroluje również wywołanie tych metod po jej ustawieniu.
Właściwości modelu ViewModelBase
MessengerInstance
MessengerInstance
ma zmienioną nazwę bezpośredniego zastąpienia, Messenger
.
// MvvmLight
IMessenger messenger = MessengerInstance;
// MVVM Toolkit
IMessenger messenger = Messenger;
Uwaga
Wartość Messenger
domyślna właściwości będzie WeakReferenceMessenger.Default
wystąpieniem, czyli standardową słabą implementacją komunikatora odniesienia w zestawie narzędzi MVVM Toolkit. Można to dostosować, wstrzykiwając inne IMessenger
wystąpienie do konstruktora ObservableRecipient
.
IsInDesignMode
Nie ma bezpośredniego zastąpienia IsInDesignMode
właściwości i każdy kod używający tego polecenia powinien zostać zmieniony lub usunięty.
Przyczyną pominięcie zestawu narzędzi MVVM Toolkit jest to, że IsInDesignMode
właściwość uwidoczniła implementacje specyficzne dla platformy. Zestaw narzędzi MVVM został zaprojektowany tak, aby był niezależny od platformy.
// MvvmLight
var isInDesignMode = IsInDesignMode;
// MVVM Toolkit
// No direct replacement, remove
Właściwości statyczne ViewModelBase
IsInDesignModeStatic
Nie ma bezpośredniego zastąpienia IsInDesignModeStatic
właściwości i każdy kod używający tego polecenia powinien zostać zmieniony lub usunięty.
Przyczyną pominięcie zestawu narzędzi MVVM Toolkit jest to, że IsInDesignMode
właściwość uwidoczniła implementacje specyficzne dla platformy. Zestaw narzędzi MVVM został zaprojektowany tak, aby był niezależny od platformy.
// MvvmLight
var isInDesignMode = ViewModelBase.IsInDesignModeStatic;
// MVVM Toolkit
// No direct replacement, remove
Migrowanie polecenia relay
Poniższe kroki koncentrują się na migrowaniu istniejących składników, które korzystają z RelayCommand
zestawu narzędzi MvvmLight.
Zestaw narzędzi MVVM Udostępnia RelayCommand
typ, który zapewnia funkcje podobne do podobnych, korzystając z interfejsu systemowego ICommand
.
Poniżej znajduje się lista migracji, które należy wykonać, jeśli są używane w bieżącym rozwiązaniu. Jeśli metoda lub właściwość nie znajduje się na liście, istnieje bezpośrednia zamiana o tej samej nazwie w zestawie narzędzi MVVM Toolkit i nie jest wymagana żadna zmiana.
Pierwsza zmiana w tym miejscu spowoduje zamianę dyrektyw przy użyciu dyrektyw w składnikach.
// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;
Uwaga
Narzędzie MvvmLight używa słabych odwołań do ustanowienia połączenia między poleceniem a akcją wywołaną ze skojarzonej klasy. Nie jest to wymagane przez implementację zestawu narzędzi MVVM Toolkit i jeśli ten opcjonalny parametr został ustawiony na true
wartość w dowolnym konstruktorze, zostanie on usunięty.
Używanie polecenia relaycommand z akcjami asynchronicznymi
Jeśli obecnie używasz implementacji mvvmLight RelayCommand
z akcjami asynchronicznymi, zestaw narzędzi MVVM uwidacznia ulepszoną implementację dla tych scenariuszy.
Możesz po prostu zastąpić istniejącą elementem RelayCommand
AsyncRelayCommand
, który został utworzony na potrzeby asynchroniczne.
// MvvmLight
var command = new RelayCommand(() => OnCommandAsync());
var command = new RelayCommand(async () => await OnCommandAsync());
// MVVM Toolkit
var asyncCommand = new AsyncRelayCommand(OnCommandAsync);
Metody RelayCommand
RaiseCanExecuteChanged()
Funkcjonalność RaiseCanExecuteChanged()
programu można osiągnąć za pomocą metody zestawu narzędzi MVVM Toolkit NotifyCanExecuteChanged()
.
// MvvmLight
var command = new RelayCommand(OnCommand);
command.RaiseCanExecuteChanged();
// MVVM Toolkit
var command = new RelayCommand(OnCommand);
command.NotifyCanExecuteChanged();
Migracji RelayCommand<T>
Poniższe kroki koncentrują się na migrowaniu istniejących składników, które korzystają z RelayCommand<T>
zestawu narzędzi MvvmLight.
Zestaw narzędzi MVVM Udostępnia RelayCommand<T>
typ, który zapewnia funkcje podobne do podobnych, korzystając z interfejsu systemowego ICommand
.
Poniżej znajduje się lista migracji, które należy wykonać, jeśli są używane w bieżącym rozwiązaniu. Jeśli metoda lub właściwość nie znajduje się na liście, istnieje bezpośrednia zamiana o tej samej nazwie w zestawie narzędzi MVVM Toolkit i nie jest wymagana żadna zmiana.
Pierwsza zmiana w tym miejscu spowoduje zamianę dyrektyw przy użyciu dyrektyw w składnikach.
// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;
Używanie RelayCommand
z akcjami asynchronicznymi
Jeśli obecnie używasz implementacji mvvmLight RelayCommand<T>
z akcjami asynchronicznymi, zestaw narzędzi MVVM uwidacznia ulepszoną implementację dla tych scenariuszy.
Możesz po prostu zastąpić istniejącą elementem RelayCommand<T>
AsyncRelayCommand<T>
, który został utworzony na potrzeby asynchroniczne.
// MvvmLight
var command = new RelayCommand<string>(async () => await OnCommandAsync());
// MVVM Toolkit
var asyncCommand = new AsyncRelayCommand<string>(OnCommandAsync);
RelayCommand<T>
Metody
RaiseCanExecuteChanged()
Funkcjonalność RaiseCanExecuteChanged()
programu można osiągnąć za pomocą metody zestawu narzędzi MVVM Toolkit NotifyCanExecuteChanged()
.
// MvvmLight
var command = new RelayCommand<string>(OnCommand);
command.RaiseCanExecuteChanged();
// MVVM Toolkit
var command = new RelayCommand<string>(OnCommand);
command.NotifyCanExecuteChanged();
Migracji SimpleIoc
Implementacja IoC w zestawie narzędzi MVVM Toolkit nie zawiera żadnej wbudowanej logiki do obsługi wstrzykiwania zależności samodzielnie, więc możesz użyć dowolnej biblioteki innej firmy do pobrania IServiceProvider
wystąpienia, które można następnie przekazać do Ioc.ConfigureServices
metody. W poniższych ServiceCollection
przykładach zostanie użyty typ z Microsoft.Extensions.DependencyInjection
biblioteki.
Jest to największa zmiana między mvvmLight a zestawem narzędzi MVVM Toolkit.
Ta implementacja będzie znajoma, jeśli zaimplementowano wstrzykiwanie zależności z aplikacjami ASP.NET Core.
Rejestrowanie zależności
W programie MvvmLight możesz zarejestrować zależności podobne do tych scenariuszy przy użyciu polecenia SimpleIoc
.
public void RegisterServices()
{
SimpleIoc.Default.Register<INavigationService, NavigationService>();
SimpleIoc.Default.Register<IDialogService>(() => new DialogService());
}
Za pomocą zestawu narzędzi MVVM można osiągnąć to samo, co w następujący sposób.
public void RegisterServices()
{
Ioc.Default.ConfigureServices(
new ServiceCollection()
.AddSingleton<INavigationService, NavigationService>()
.AddSingleton<IDialogService>(new DialogService())
.BuildServiceProvider());
}
Rozwiązywanie zależności
Po zainicjowaniu usługi można pobrać z klasy tak jak w Ioc
przypadku SimpleIoc
polecenia :
IDialogService dialogService = SimpleIoc.Default.GetInstance<IDialogService>();
Migracja do zestawu narzędzi MVVM Pozwala to osiągnąć w taki sam sposób:
IDialogService dialogService = Ioc.Default.GetService<IDialogService>();
Usuwanie zależności
W SimpleIoc
programie należy wyrejestrowyć zależności przy użyciu następującego wywołania metody.
SimpleIoc.Default.Unregister<INavigationService>();
Nie ma bezpośredniego zastąpienia usuwania zależności z implementacją zestawu narzędzi MVVM Toolkit Ioc
.
Preferowany konstruktor
Podczas rejestrowania zależności za pomocą klasy MvvmLight SimpleIoc
możesz podać PreferredConstructor
atrybut dla tych z wieloma konstruktorami.
Ten atrybut będzie wymagał usunięcia miejsca użycia i będzie konieczne użycie dowolnych atrybutów z biblioteki iniekcji zależności innej firmy w użyciu, jeśli są obsługiwane.
Migracji Messenger
Poniższe kroki koncentrują się na migrowaniu istniejących składników, które korzystają z Messenger
zestawu narzędzi MvvmLight.
Zestaw narzędzi MVVM Toolkit udostępnia dwie implementacje komunikatora (WeakReferenceMessenger
i StrongReferenceMessenger
, zobacz dokumentację tutaj), która zapewnia podobne funkcje, z pewnymi kluczowymi różnicami opisanymi poniżej.
Poniżej znajduje się lista migracji, które należy wykonać, jeśli są używane w bieżącym rozwiązaniu.
Pierwsza zmiana w tym miejscu spowoduje zamianę dyrektyw przy użyciu dyrektyw w składnikach.
// MvvmLight
using GalaSoft.MvvmLight.Messaging;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Messaging;
Metody messengera
Register<TMessage>(object, Action<TMessage>)
Funkcjonalność Register<TMessage>(object, Action<TMessage>)
programu można osiągnąć za pomocą metody Register<TRecipient, TMessage>(object, MessageHandler<TRecipient, TMessage>)
rozszerzenia zestawu narzędzi MVVM .IMessenger
// MvvmLight
Messenger.Default.Register<MyMessage>(this, this.OnMyMessageReceived);
// MVVM Toolkit
Messenger.Register<MyViewModel, MyMessage>(this, static (r, m) => r.OnMyMessageReceived(m));
Powodem tego podpisu jest to, że pozwala posłańcowi używać słabych odwołań do prawidłowego śledzenia adresatów i unikać tworzenia zamknięć w celu przechwycenia samego odbiorcy. Oznacza to, że odbiorca danych wejściowych jest przekazywany jako dane wejściowe do wyrażenia lambda, więc nie musi być przechwytywany przez samo wyrażenie lambda. Powoduje to również zwiększenie wydajności kodu, ponieważ ten sam program obsługi może być ponownie używany wiele razy bez alokacji. Należy pamiętać, że jest to tylko jeden z obsługiwanych sposobów rejestrowania programów obsługi i można również użyć interfejsu IRecipient<TMessage>
(szczegółowego w dokumentacji komunikatora), co sprawia, że rejestracja jest automatyczna i mniej szczegółowa.
Uwaga
Modyfikator static
wyrażeń lambda wymaga języka C# 9 i jest opcjonalny. Warto użyć go w tym miejscu, aby upewnić się, że nie przechwytujesz adresata lub innego członka, dlatego powoduje alokację zamknięcia, ale nie jest to obowiązkowe. Jeśli nie możesz użyć języka C# 9, możesz usunąć static
go tutaj i po prostu zachować ostrożność, aby upewnić się, że kod nie przechwytuje niczego.
Ponadto w tym przykładzie i poniższych będzie po prostu używać Messenger
właściwości z .ObservableRecipient
Jeśli chcesz po prostu statycznie uzyskać dostęp do wystąpienia komunikatora z dowolnego miejsca w kodzie, te same przykłady mają zastosowanie, a jedyną różnicą jest to, że Messenger
należy zastąpić na przykład. WeakReferenceMessenger.Default
Zamiast.
Register<TMessage>(object, bool, Action<TMessage>)
Nie ma bezpośredniego zastąpienia tego mechanizmu rejestracji, który umożliwia również obsługę odbierania komunikatów dla typów komunikatów pochodnych. Ta zmiana jest celowa, ponieważ implementacja Messenger
ma na celu nieumyślne wykorzystanie odbicia w celu osiągnięcia korzyści z wydajności.
Alternatywnie istnieje kilka opcji, które można wykonać, aby osiągnąć tę funkcję.
- Tworzenie implementacji niestandardowej
IMessenger
. - Zarejestruj dodatkowe typy komunikatów przy użyciu procedury obsługi udostępnionej niż następnie sprawdza typ i wywołuje właściwą metodę.
// 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>)
Funkcjonalność Register<TMessage>(object, object, Action<TMessage>)
programu można osiągnąć za pomocą metody zestawu narzędzi MVVM Toolkit Register<TRecipient, TMessage, TToken>(object, TToken, MessageHandler<TRecipient, TMessage>)
.
// 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>)
Nie ma bezpośredniego zastąpienia tego mechanizmu rejestracji, który umożliwia również obsługę odbierania komunikatów dla typów komunikatów pochodnych. Ta zmiana jest celowa, ponieważ implementacja Messenger
ma na celu nieumyślne wykorzystanie odbicia w celu osiągnięcia korzyści z wydajności.
Alternatywnie istnieje kilka opcji, które można wykonać, aby osiągnąć tę funkcję.
- Tworzenie implementacji niestandardowej
IMessenger
. - Zarejestruj dodatkowe typy komunikatów przy użyciu procedury obsługi udostępnionej niż następnie sprawdza typ i wywołuje właściwą metodę.
// 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)
Funkcjonalność Send<TMessage>(TMessage)
programu można osiągnąć za pomocą metody Send<TMessage>(TMessage)
rozszerzenia zestawu narzędzi MVVM .IMessenger
// MvvmLight
Messenger.Default.Send<MyMessage>(new MyMessage());
Messenger.Default.Send(new MyMessage());
// MVVM Toolkit
Messenger.Send(new MyMessage());
W powyższym scenariuszu, w którym wysyłany komunikat ma konstruktor bez parametrów, zestaw NARZĘDZI MVVM ma uproszczone rozszerzenie do wysyłania komunikatu w tym formacie.
// MVVM Toolkit
Messenger.Send<MyMessage>();
Send<TMessage>(TMessage, object)
Funkcjonalność Send<TMessage>(TMessage, object)
programu można osiągnąć za pomocą metody zestawu narzędzi MVVM Toolkit Send<TMessage, TToken>(TMessage, TToken)
.
// 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)
Funkcjonalność Unregister(object)
programu można osiągnąć za pomocą metody zestawu narzędzi MVVM Toolkit UnregisterAll(object)
.
// MvvmLight
Messenger.Default.Unregister(this);
// MVVM Toolkit
Messenger.UnregisterAll(this);
Unregister<TMessage>(object)
Funkcjonalność Unregister<TMessage>(object)
programu można osiągnąć za pomocą metody Unregister<TMessage>(object)
rozszerzenia zestawu narzędzi MVVM .IMessenger
// MvvmLight
Messenger.Default.Unregister<MyMessage>(this);
// MVVM Toolkit
Messenger.Unregister<MyMessage>(this);
Unregister<TMessage>(object, Action<TMessage>)
Nie ma bezpośredniego zastąpienia Unregister<TMessage>(object, Action<TMessage>)
metody w zestawie narzędzi MVVM Toolkit.
Przyczyną pominięcia jest to, że adresat wiadomości może mieć tylko jedną zarejestrowaną procedurę obsługi dla dowolnego typu wiadomości.
Zalecamy osiągnięcie tej funkcji za pomocą metody Unregister<TMessage>(object)
rozszerzenia mvVM ToolkitIMessenger
.
// MvvmLight
Messenger.Default.Unregister<MyMessage>(this, OnMyMessageReceived);
// MVVM Toolkit
Messenger.Unregister<MyMessage>(this);
Unregister<TMessage>(object, object)
Funkcjonalność Unregister<TMessage>(object, object)
programu można osiągnąć za pomocą metody zestawu narzędzi MVVM Toolkit Unregister<TMessage, TToken>(object, TToken)
.
// MvvmLight
Messenger.Default.Unregister<MyMessage>(this, nameof(MyViewModel));
// MVVM Toolkit
Messenger.Unregister<MyMessage, string>(this, nameof(MyViewModel));
Unregister<TMessage>(object, object, Action<TMessage>)
Nie ma bezpośredniego zastąpienia Unregister<TMessage>(object, object, Action<TMessage>)
metody w zestawie narzędzi MVVM Toolkit.
Przyczyną pominięcia jest to, że adresat wiadomości może mieć tylko jedną zarejestrowaną procedurę obsługi dla dowolnego typu wiadomości.
Zalecamy osiągnięcie tej funkcji za pomocą metody MVVM Toolkit Unregister<TMessage, TToken>(object, TToken)
.
// MvvmLight
Messenger.Default.Unregister<MyMessage>(this, nameof(MyViewModel), OnMyMessageReceived);
// MVVM Toolkit
Messenger.Unregister<MyMessage, string>(this, nameof(MyViewModel));
Cleanup()
Metoda Cleanup
ma bezpośrednią zamianę o tej samej nazwie w zestawie narzędzi MVVM Toolkit. Należy pamiętać, że ta metoda jest przydatna tylko wtedy, gdy komunikator używający słabych odwołań jest używany, podczas gdy StrongReferenceMessenger
typ po prostu nic nie zrobi, gdy ta metoda jest wywoływana, ponieważ stan wewnętrzny jest już automatycznie przycinany, ponieważ komunikator jest używany.
// MvvmLight
Messenger.Default.Cleanup();
// MVVM Toolkit
Messenger.Cleanup();
RequestCleanup()
Nie ma bezpośredniego zastąpienia RequestCleanup
metody w zestawie narzędzi MVVM Toolkit. W kontekście mvvmLight służy do inicjowania żądania usunięcia rejestracji, które nie są już aktywne, RequestCleanup
ponieważ implementacja korzysta ze słabych odwołań.
Wszelkie wywołania RequestCleanup
metody można usunąć lub zamienić na Cleanup
.
// MvvmLight
Messenger.Default.RequestCleanup();
// MVVM Toolkit
// No direct replacement, remove
ResetAll()
Funkcjonalność ResetAll()
programu można osiągnąć za pomocą metody zestawu narzędzi MVVM Toolkit Reset()
.
W przeciwieństwie do implementacji mvvmLight, która dopuszcza wartość null wystąpienia, zestaw narzędzi MVVM czyści zarejestrowane mapy.
// MvvmLight
Messenger.Default.ResetAll();
// MVVM Toolkit
Messenger.Reset();
Metody statyczne messengera
OverrideDefault(IMessenger)
Nie ma bezpośredniego zastąpienia OverrideDefault(IMessenger)
metody w zestawie narzędzi MVVM Toolkit.
Aby użyć niestandardowej IMessenger
implementacji elementu , zarejestrowano niestandardową implementację w rejestracjach usługi na potrzeby wstrzykiwania zależności lub ręcznie skonstruuj wystąpienie statyczne i przekaż je w razie potrzeby.
// MvvmLight
Messenger.OverrideDefault(new Messenger());
// MVVM Toolkit
// No direct replacement
Reset()
Nie ma bezpośredniego zastąpienia metody statycznej Reset
w zestawie narzędzi MVVM Toolkit.
Tę samą funkcjonalność można osiągnąć, wywołując metodę Reset
statycznego Default
wystąpienia jednego z typów komunikatora.
// MvvmLight
Messenger.Reset();
// MVVM Toolkit
WeakReferenceMessenger.Default.Reset();
Właściwości statyczne messengera
Default
Default
ma bezpośrednią zamianę , Default
nie wymagając żadnych zmian w istniejącej implementacji.
// MvvmLight
IMessenger messenger = Messenger.Default;
// MVVM Toolkit
IMessenger messenger = WeakReferenceMessenger.Default;
Migrowanie typów komunikatów
Typy komunikatów dostępne w zestawie narzędzi MvvmLight są zaprojektowane jako podstawa, z którą możesz pracować w razie potrzeby jako deweloper.
Zestaw narzędzi MVVM Toolkit udostępnia pewne alternatywy, ale nie ma bezpośredniego zastąpienia tych typów komunikatów. Zalecamy zapoznanie się z naszymi dostępnymi typami komunikatów.
Alternatywnie, jeśli twoje rozwiązanie korzysta z typów komunikatów MvvmLight, można je łatwo przenosić do własnej bazy kodu.
Migrowanie składników specyficznych dla platformy
W bieżącej implementacji zestawu narzędzi MVVM Toolkit nie ma zamienników składników specyficznych dla platformy, które istnieją w zestawie narzędzi MvvmLight.
Poniższe składniki i skojarzone z nimi metody pomocników/rozszerzeń nie mają zastąpienia i będą musiały rozważyć migrację do zestawu narzędzi MVVM Toolkit.
Specyficzne dla systemu Android/iOS/Windows
DialogService
DispatcherHelper
NavigationService
Specyficzne dla systemu Android/iOS
ActivityBase
Binding
BindingMode
PropertyChangedEventManager
UpdateTriggerMode
Specyficzne dla systemu Android
CachingViewHolder
ObservableAdapter
ObservableRecyclerAdapter
Specyficzne dla systemu iOS
ObservableCollectionViewSource
ObservableTableViewController
ObservableTableViewSource
Pomocników
Empty
WeakAction
WeakFunc