Udostępnij za pośrednictwem


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>AsyncRelayCommandWeakReferenceMessengerMessageHandler<TRecipient, TMessage>RelayCommandIRecipient<TMessage>AsyncRelayCommand<T>StrongReferenceMessengerIMessengerObservableRecipientObservableObjectIMessengerExtensions

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 SetPropertymetody , 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 Cleanuppolecenia .

Jednak właściwość uwidacznia ObservableRecipientIsActive 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 RelayCommandAsyncRelayCommand , 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 SimpleIocpolecenia :

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 SimpleIocprogramie 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 SimpleIocmoż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 IMessengerimplementacji 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ę , Defaultnie 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