Миграция с MvmLight
В этой статье описаны некоторые основные различия между MvvmLight набор средств и MVVM набор средств для упрощения миграции.
Хотя в этой статье основное внимание уделяется миграции с MvmLight на набор средств MVVM, обратите внимание, что в набор средств MVVM были добавлены дополнительные улучшения, поэтому настоятельно рекомендуется ознакомиться с документацией по отдельным новым API.
API платформы:
ObservableObject
,ObservableRecipient
AsyncRelayCommand<T>
WeakReferenceMessenger
IMessenger
StrongReferenceMessenger
RelayCommand<T>
AsyncRelayCommand
RelayCommand
, ,IRecipient<TMessage>
MessageHandler<TRecipient, TMessage>
IMessengerExtensions
Установка набор средств MVVM
Чтобы воспользоваться преимуществами MVVM набор средств, сначала необходимо установить последний пакет NuGet в существующем приложении .NET.
Установка с помощью .NET CLI
dotnet add package CommunityToolkit.Mvvm --version 8.1.0
Установка с помощью PackageReference
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.1.0" />
Перенос ObservableObject
Ниже описано, как перенести существующие компоненты, которые используют преимущества ObservableObject
MvmLight набор средств. Набор средств MVVM предоставляет аналогичный ObservableObject
тип.
Первое изменение здесь будет переключение директив с помощью директив в компонентах.
// MvvmLight
using GalaSoft.MvvmLight;
// MVVM Toolkit
using CommunityToolkit.Mvvm.ComponentModel;
Ниже приведен список миграций, которые необходимо выполнить при использовании в текущем решении.
Методы ObservableObject
Set<T>(Expression, ref T, T)
Set(Expression, ref T, T)
не имеет замены сигнатуры метода like-for-like.
SetProperty(ref T, T, string)
Однако предоставляет те же функциональные возможности с дополнительными преимуществами производительности.
// MvvmLight
Set(() => MyProperty, ref this.myProperty, value);
// MVVM Toolkit
SetProperty(ref this.myProperty, value);
Обратите внимание, что string
параметр не требуется, если метод вызывается из метода задания свойства, так как он выводится из имени члена вызывающего объекта, как показано здесь. Если вы хотите вызвать SetProperty
свойство, отличное от того, где вызывается метод, можно сделать это с помощью nameof
оператора, что может быть полезно, чтобы сделать код менее подверженным ошибкам, не имея жестких имен. Например:
SetProperty(ref this.someProperty, value, nameof(SomeProperty));
Set<T>(string, ref T, T)
Set<T>(string, ref T, T)
не имеет замены сигнатуры метода like-for-like.
SetProperty<T>(ref T, T, string)
Однако предоставляет те же функции с перезапорядоченными параметрами.
// 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)
имеет переименованную прямую замену, 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)
имеет переименованную прямую замену, OnPropertyChanged(string)
.
// MvvmLight
RaisePropertyChanged(nameof(MyProperty));
// MVVM Toolkit
OnPropertyChanged();
Как и при использовании SetProperty
, имя текущего свойства автоматически выводится методом OnPropertyChanged
. Если вы хотите использовать этот метод для ручного вызова PropertyChanged
события для другого свойства, можно также вручную указать имя этого свойства с помощью nameof
оператора еще раз. Например:
OnPropertyChanged(nameof(SomeProperty));
RaisePropertyChanged<T>(Expression)
RaisePropertyChanged<T>(Expression)
не имеет прямой замены.
Для повышения производительности рекомендуется заменить RaisePropertyChanged<T>(Expression)
OnPropertyChanged(string)
набор средств вместо nameof
ключевое слово (или без параметров, если целевое свойство совпадает с одним вызовом метода, поэтому имя можно вывести автоматически, как упоминание выше).
// MvvmLight
RaisePropertyChanged(() => MyProperty);
// MVVM Toolkit
OnPropertyChanged(nameof(MyProperty));
VerifyPropertyName(string)
Для метода нет прямой замены VerifyPropertyName(string)
, а любой код, использующий этот код, должен быть изменен или удален.
Причина упущения из MVVM набор средств заключается в том, что использование nameof
ключевое слово для свойства проверяет наличие. При создании MvvmLight ключевое слово недоступен, nameof
и этот метод использовался для обеспечения наличия свойства в объекте.
// MvvmLight
VerifyPropertyName(nameof(MyProperty));
// MVVM Toolkit
// No direct replacement, remove
Свойства ObservableObject
PropertyChangedHandler
PropertyChangedHandler
не имеет прямой замены.
Чтобы вызвать событие изменения свойства с помощью обработчика PropertyChanged
событий, необходимо вместо этого вызвать OnPropertyChanged
метод.
// MvvmLight
PropertyChangedEventHandler handler = PropertyChangedHandler;
// MVVM Toolkit
OnPropertyChanged();
Перенос ViewModelBase
Ниже описано, как перенести существующие компоненты, которые используют преимущества ViewModelBase
MvmLight набор средств.
MVVM набор средств предоставляет ObservableRecipient
тип, предоставляющий аналогичные функциональные возможности.
Ниже приведен список миграций, которые необходимо выполнить при использовании в текущем решении.
Методы ViewModelBase
Set<T>(string, ref T, T, bool)
Set<T>(string, ref T, T, bool)
не имеет замены сигнатуры метода like-for-like.
SetProperty<T>(ref T, T, bool, string)
Однако предоставляет те же функции с перезапорядоченными параметрами.
// MvvmLight
Set(nameof(MyProperty), ref this.myProperty, value, true);
// MVVM Toolkit
SetProperty(ref this.myProperty, value, true);
Обратите внимание, что значения и логическое значение не являются необязательными в реализации MVVM набор средств и должны быть предоставлены для использования этого метода. Причиной этого изменения является то, что при вызове этого метода параметр широковещательной передачи по умолчанию вызывает метод ObservableObject SetProperty
.
Кроме того, параметр не требуется, string
если метод вызывается из метода задания свойства, так как он выводится из имени члена вызывающего объекта, как и методы в базовом ObservableObject
классе.
Set<T>(ref T, T, bool, string)
Set<T>(ref T, T, bool, string)
имеет переименованную прямую замену, 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)
не имеет прямой замены.
Для повышения производительности рекомендуется заменить его на MVVM набор средствSetProperty<T>(ref T, T, bool, string)
, используя nameof
вместо этого ключевое слово.
// 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)
имеет прямую замену, которая не требует переименования.
// MvvmLight
Broadcast<MyObject>(oldValue, newValue, nameof(MyProperty));
// MVVM Toolkit
Broadcast(oldValue, newValue, nameof(MyProperty));
Обратите внимание, что сообщение, отправленное через Messenger
свойство при вызове Broadcast
метода, имеет прямую замену PropertyChangedMessage
в библиотеке MVVM набор средств.
RaisePropertyChanged<T>(string, T, T, bool)
Для метода нет прямой замены RaisePropertyChanged<T>(string, T, T, bool)
.
Самый простой альтернативой является вызов OnPropertyChanged
и последующий вызов Broadcast
для достижения этой функции.
// MvvmLight
RaisePropertyChanged<MyObject>(nameof(MyProperty), oldValue, newValue, true);
// MVVM Toolkit
OnPropertyChanged();
Broadcast(oldValue, newValue, nameof(MyProperty));
RaisePropertyChanged<T>(Expression, T, T, bool)
Для метода нет прямой замены RaisePropertyChanged<T>(Expression, T, T, bool)
.
Самый простой альтернативой является вызов OnPropertyChanged
и последующий вызов Broadcast
для достижения этой функции.
// MvvmLight
RaisePropertyChanged<MyObject>(() => MyProperty, oldValue, newValue, true);
// MVVM Toolkit
OnPropertyChanged(nameof(MyProperty));
Broadcast(oldValue, newValue, nameof(MyProperty));
ICleanup.Cleanup()
Для интерфейса нет прямой замены ICleanup
.
Однако предоставляет ObservableRecipient
OnDeactivated
метод, который следует использовать для предоставления той же функциональности, что Cleanup
и .
OnDeactivated
в набор средств MVVM также отменят регистрацию всех зарегистрированных событий messenger при вызове.
// MvvmLight
Cleanup();
// MVVM Toolkit
OnDeactivated();
Обратите внимание, что OnActivated
методы и OnDeactivated
методы можно вызывать из существующего решения как с Cleanup
.
Тем не менее, предоставляет ObservableRecipient
свойство, которое также управляет вызовом IsActive
этих методов при его установке.
Свойства ViewModelBase
MessengerInstance
MessengerInstance
имеет переименованную прямую замену, Messenger
.
// MvvmLight
IMessenger messenger = MessengerInstance;
// MVVM Toolkit
IMessenger messenger = Messenger;
Примечание.
Значение Messenger
по умолчанию свойства будет WeakReferenceMessenger.Default
экземпляром, который является стандартной реализацией слабого ссылочного messenger в набор средств MVVM. Это можно настроить, просто введя другой IMessenger
экземпляр в ObservableRecipient
конструктор.
IsInDesignMode
Для свойства нет прямой замены IsInDesignMode
, а любой код, использующий этот код, должен быть изменен или удален.
Причина упущения из набор средств MVVM заключается в том, что IsInDesignMode
свойство предоставляет реализации для конкретной платформы. Набор средств MVVM была разработана для обеспечения доступности платформы.
// MvvmLight
var isInDesignMode = IsInDesignMode;
// MVVM Toolkit
// No direct replacement, remove
Статические свойства ViewModelBase
IsInDesignModeStatic
Для свойства нет прямой замены IsInDesignModeStatic
, а любой код, использующий этот код, должен быть изменен или удален.
Причина упущения из набор средств MVVM заключается в том, что IsInDesignMode
свойство предоставляет реализации для конкретной платформы. Набор средств MVVM была разработана для обеспечения доступности платформы.
// MvvmLight
var isInDesignMode = ViewModelBase.IsInDesignModeStatic;
// MVVM Toolkit
// No direct replacement, remove
Перенос RelayCommand
Ниже описано, как перенести существующие компоненты, которые используют преимущества RelayCommand
MvmLight набор средств.
MVVM набор средств предоставляет тип, который предоставляет RelayCommand
функции, подобные ICommand
функциям, используя системный интерфейс.
Ниже приведен список миграций, которые необходимо выполнить при использовании в текущем решении. Если метод или свойство не указано, существует прямая замена с тем же именем в MVVM набор средств и не требуется никаких изменений.
Первое изменение здесь будет переключение директив с помощью директив в компонентах.
// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;
Примечание.
MvvmLight использует слабые ссылки для установления связи между командой и действием, вызываемым из связанного класса. Это не обязательно для реализации MVVM набор средств, и если этот необязательный параметр был задан true
в любом из конструкторов, это будет удалено.
Использование RelayCommand с асинхронными действиями
Если в настоящее время используется реализация MvmLight RelayCommand
с асинхронными действиями, MVVM набор средств предоставляет улучшенную реализацию для этих сценариев.
Вы можете просто заменить существующий RelayCommand
AsyncRelayCommand
на созданный для асинхронных целей.
// MvvmLight
var command = new RelayCommand(() => OnCommandAsync());
var command = new RelayCommand(async () => await OnCommandAsync());
// MVVM Toolkit
var asyncCommand = new AsyncRelayCommand(OnCommandAsync);
Методы RelayCommand
RaiseCanExecuteChanged()
Функциональные RaiseCanExecuteChanged()
возможности можно достичь с помощью метода MVVM набор средствNotifyCanExecuteChanged()
.
// MvvmLight
var command = new RelayCommand(OnCommand);
command.RaiseCanExecuteChanged();
// MVVM Toolkit
var command = new RelayCommand(OnCommand);
command.NotifyCanExecuteChanged();
Перенос RelayCommand<T>
Ниже описано, как перенести существующие компоненты, которые используют преимущества RelayCommand<T>
MvmLight набор средств.
MVVM набор средств предоставляет тип, который предоставляет RelayCommand<T>
функции, подобные ICommand
функциям, используя системный интерфейс.
Ниже приведен список миграций, которые необходимо выполнить при использовании в текущем решении. Если метод или свойство не указано, существует прямая замена с тем же именем в MVVM набор средств и не требуется никаких изменений.
Первое изменение здесь будет переключение директив с помощью директив в компонентах.
// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;
Использование RelayCommand
с асинхронными действиями
Если в настоящее время используется реализация MvmLight RelayCommand<T>
с асинхронными действиями, MVVM набор средств предоставляет улучшенную реализацию для этих сценариев.
Вы можете просто заменить существующий RelayCommand<T>
AsyncRelayCommand<T>
на созданный для асинхронных целей.
// MvvmLight
var command = new RelayCommand<string>(async () => await OnCommandAsync());
// MVVM Toolkit
var asyncCommand = new AsyncRelayCommand<string>(OnCommandAsync);
RelayCommand<T>
Методы
RaiseCanExecuteChanged()
Функциональные RaiseCanExecuteChanged()
возможности можно достичь с помощью метода MVVM набор средствNotifyCanExecuteChanged()
.
// MvvmLight
var command = new RelayCommand<string>(OnCommand);
command.RaiseCanExecuteChanged();
// MVVM Toolkit
var command = new RelayCommand<string>(OnCommand);
command.NotifyCanExecuteChanged();
Перенос SimpleIoc
Реализация IoC в набор средств MVVM не включает встроенную логику для обработки внедрения зависимостей самостоятельно, поэтому вы можете использовать любую стороннюю библиотеку для получения IServiceProvider
экземпляра, который затем можно передать в Ioc.ConfigureServices
метод. В приведенных ниже ServiceCollection
примерах будет использоваться тип из библиотеки Microsoft.Extensions.DependencyInjection
.
Это самое большое изменение между MvmLight и MVVM набор средств.
Эта реализация будет знакома, если вы реализовали внедрение зависимостей с помощью ASP.NET основных приложений.
Регистрация зависимостей
При использовании MvvmLight возможно, вы зарегистрировали зависимости, аналогичные этим сценариям SimpleIoc
.
public void RegisterServices()
{
SimpleIoc.Default.Register<INavigationService, NavigationService>();
SimpleIoc.Default.Register<IDialogService>(() => new DialogService());
}
С помощью набор средств MVVM вы сможете добиться того же, как показано ниже.
public void RegisterServices()
{
Ioc.Default.ConfigureServices(
new ServiceCollection()
.AddSingleton<INavigationService, NavigationService>()
.AddSingleton<IDialogService>(new DialogService())
.BuildServiceProvider());
}
Разрешение зависимостей
После инициализации службы можно получить из Ioc
класса так же, как и с SimpleIoc
:
IDialogService dialogService = SimpleIoc.Default.GetInstance<IDialogService>();
Миграция на набор средств MVVM обеспечивает то же самое.
IDialogService dialogService = Ioc.Default.GetService<IDialogService>();
Удаление зависимостей
При этом SimpleIoc
вы отмените регистрацию зависимостей с помощью следующего вызова метода.
SimpleIoc.Default.Unregister<INavigationService>();
Нет прямой замены для удаления зависимостей с реализацией MVVM набор средствIoc
.
Предпочтительный конструктор
При регистрации зависимостей в MvvmLight SimpleIoc
есть возможность в классах предоставить PreferredConstructor
атрибут для нескольких конструкторов.
Этот атрибут потребует удаления, где используется, и вам потребуется использовать любые атрибуты из библиотеки внедрения зависимостей сторон, если она поддерживается.
Перенос Messenger
Ниже описано, как перенести существующие компоненты, которые используют преимущества Messenger
MvmLight набор средств.
MVVM набор средств предоставляет две реализации messenger (WeakReferenceMessenger
и StrongReferenceMessenger
см. здесь документы), которые предоставляют аналогичные функциональные возможности, с некоторыми ключевыми различиями, описанными ниже.
Ниже приведен список миграций, которые необходимо выполнить при использовании в текущем решении.
Первое изменение здесь будет переключение директив с помощью директив в компонентах.
// MvvmLight
using GalaSoft.MvvmLight.Messaging;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Messaging;
Методы Messenger
Register<TMessage>(object, Action<TMessage>)
Функциональные Register<TMessage>(object, Action<TMessage>)
возможности можно достичь с помощью метода Register<TRecipient, TMessage>(object, MessageHandler<TRecipient, TMessage>)
расширения MVVM набор средствIMessenger
.
// MvvmLight
Messenger.Default.Register<MyMessage>(this, this.OnMyMessageReceived);
// MVVM Toolkit
Messenger.Register<MyViewModel, MyMessage>(this, static (r, m) => r.OnMyMessageReceived(m));
Причина этой подписи заключается в том, что он позволяет messenger использовать слабые ссылки для правильного отслеживания получателей и избегать создания закрытий для захвата самого получателя. То есть получатель входных данных передается в качестве входных данных в лямбда-выражение, поэтому его не нужно захватывать лямбда-выражением. Это также приводит к более эффективному коду, так как один и тот же обработчик может многократно использоваться несколько раз без выделения. Обратите внимание, что это только один из поддерживаемых способов регистрации обработчиков, и вместо этого можно использовать IRecipient<TMessage>
интерфейс (подробно в документации по messenger), что делает регистрацию автоматической и менее подробной.
Примечание.
Модификатор static
для лямбда-выражений требует C# 9 и необязателен. Полезно использовать его здесь, чтобы убедиться, что вы не случайно захватываете получателя или другого члена, следовательно, вызывая выделение закрытия, но это не обязательно. Если вы не можете использовать C# 9, вы можете просто удалить static
здесь и будьте осторожны, чтобы убедиться, что код не захватывает ничего.
Кроме того, этот пример и те, из которых приведены ниже, будут использовать Messenger
свойство.ObservableRecipient
Если вы хотите просто статически получить доступ к экземпляру messenger из любого места в коде, то те же примеры также применяются, с единственным отличием, которое Messenger
необходимо заменить на например. WeakReferenceMessenger.Default
Вместо.
Register<TMessage>(object, bool, Action<TMessage>)
Для этого механизма регистрации нет прямой замены, что позволяет также поддерживать получение сообщений для производных типов сообщений. Это изменение намеренно, так как Messenger
реализация направлена на то, чтобы не использовать отражение для достижения своих преимуществ производительности.
Кроме того, существует несколько вариантов, которые можно сделать для достижения этой функциональности.
- Создайте пользовательскую
IMessenger
реализацию. - Зарегистрируйте дополнительные типы сообщений с помощью общего обработчика, чем затем проверка тип и вызывает правильный метод.
// 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>)
Функциональные Register<TMessage>(object, object, Action<TMessage>)
возможности можно достичь с помощью метода MVVM набор средств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>)
Для этого механизма регистрации нет прямой замены, что позволяет также поддерживать получение сообщений для производных типов сообщений. Это изменение намеренно, так как Messenger
реализация направлена на то, чтобы не использовать отражение для достижения своих преимуществ производительности.
Кроме того, существует несколько вариантов, которые можно сделать для достижения этой функциональности.
- Создайте пользовательскую
IMessenger
реализацию. - Зарегистрируйте дополнительные типы сообщений с помощью общего обработчика, чем затем проверка тип и вызывает правильный метод.
// 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)
Функциональные Send<TMessage>(TMessage)
возможности можно достичь с помощью метода Send<TMessage>(TMessage)
расширения MVVM набор средствIMessenger
.
// MvvmLight
Messenger.Default.Send<MyMessage>(new MyMessage());
Messenger.Default.Send(new MyMessage());
// MVVM Toolkit
Messenger.Send(new MyMessage());
В приведенном выше сценарии, когда отправленное сообщение имеет конструктор без параметров, MVVM набор средств имеет упрощенное расширение для отправки сообщения в этом формате.
// MVVM Toolkit
Messenger.Send<MyMessage>();
Send<TMessage>(TMessage, object)
Функциональные Send<TMessage>(TMessage, object)
возможности можно достичь с помощью метода MVVM набор средств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)
Функциональные Unregister(object)
возможности можно достичь с помощью метода MVVM набор средствUnregisterAll(object)
.
// MvvmLight
Messenger.Default.Unregister(this);
// MVVM Toolkit
Messenger.UnregisterAll(this);
Unregister<TMessage>(object)
Функциональные Unregister<TMessage>(object)
возможности можно достичь с помощью метода Unregister<TMessage>(object)
расширения MVVM набор средствIMessenger
.
// MvvmLight
Messenger.Default.Unregister<MyMessage>(this);
// MVVM Toolkit
Messenger.Unregister<MyMessage>(this);
Unregister<TMessage>(object, Action<TMessage>)
В набор средств MVVM нет прямой замены Unregister<TMessage>(object, Action<TMessage>)
метода.
Причина упущения заключается в том, что получатель сообщения может иметь только один зарегистрированный обработчик для любого заданного типа сообщения.
Мы рекомендуем достичь этой функции с помощью метода Unregister<TMessage>(object)
расширения MVVM набор средствIMessenger
.
// MvvmLight
Messenger.Default.Unregister<MyMessage>(this, OnMyMessageReceived);
// MVVM Toolkit
Messenger.Unregister<MyMessage>(this);
Unregister<TMessage>(object, object)
Функциональные Unregister<TMessage>(object, object)
возможности можно достичь с помощью метода MVVM набор средств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>)
В набор средств MVVM нет прямой замены Unregister<TMessage>(object, object, Action<TMessage>)
метода.
Причина упущения заключается в том, что получатель сообщения может иметь только один зарегистрированный обработчик для любого заданного типа сообщения.
Мы рекомендуем достичь этой функции с помощью метода 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()
Метод Cleanup
имеет прямую замену с тем же именем в набор средств MVVM. Обратите внимание, что этот метод полезен только при использовании посланника с использованием слабых ссылок, в то время как тип просто не будет делать ничего, когда этот метод вызывается, так StrongReferenceMessenger
как внутреннее состояние уже обрезается автоматически по мере использования messenger.
// MvvmLight
Messenger.Default.Cleanup();
// MVVM Toolkit
Messenger.Cleanup();
RequestCleanup()
В набор средств MVVM нет прямой замены RequestCleanup
метода. В контексте MvmLight используется для запуска запроса на удаление регистраций, RequestCleanup
которые больше не живы, так как реализация использует слабые ссылки.
Все вызовы RequestCleanup
метода можно удалить или заменить на Cleanup
.
// MvvmLight
Messenger.Default.RequestCleanup();
// MVVM Toolkit
// No direct replacement, remove
ResetAll()
Функциональные ResetAll()
возможности можно достичь с помощью метода MVVM набор средствReset()
.
В отличие от реализации MvvmLight, которая запустит экземпляр, MVVM набор средств очищает зарегистрированные карты.
// MvvmLight
Messenger.Default.ResetAll();
// MVVM Toolkit
Messenger.Reset();
Статические методы Messenger
OverrideDefault(IMessenger)
В набор средств MVVM нет прямой замены OverrideDefault(IMessenger)
метода.
Чтобы использовать пользовательскую реализацию, либо зарегистрировали пользовательскую реализацию IMessenger
в регистрации служб для внедрения зависимостей, либо вручную создайте статический экземпляр и передайте его, где это необходимо.
// MvvmLight
Messenger.OverrideDefault(new Messenger());
// MVVM Toolkit
// No direct replacement
Reset()
В набор средств MVVM не существует прямой замены статического Reset
метода.
Те же функции можно достичь, вызвав Reset
метод статического Default
экземпляра одного из типов messenger.
// MvvmLight
Messenger.Reset();
// MVVM Toolkit
WeakReferenceMessenger.Default.Reset();
Статические свойства Messenger
Default
Default
имеет прямую замену, Default
требуя никаких изменений в существующей реализации.
// MvvmLight
IMessenger messenger = Messenger.Default;
// MVVM Toolkit
IMessenger messenger = WeakReferenceMessenger.Default;
Перенос типов сообщений
Типы сообщений, предоставляемые в наборе средств MvmLight, предназначены в качестве основы для работы с разработчиком при необходимости.
Хотя набор средств MVVM предоставляет некоторые альтернативные варианты, для этих типов сообщений нет прямой замены. Мы рекомендуем ознакомиться с доступными типами сообщений.
Кроме того, если решение использует типы сообщений MvvmLight, их можно легко перенести в собственную базу кода.
Перенос компонентов для конкретной платформы
В текущей реализации MVVM набор средств отсутствуют замены компонентов, относящихся к платформе, которые существуют в наборе средств MvmLight.
Следующие компоненты и связанные вспомогательные методы или методы расширения не имеют замены и должны учитываться при миграции на MVVM набор средств.
Особенности Android/iOS/Windows
DialogService
DispatcherHelper
NavigationService
Конкретное устройство Android/iOS
ActivityBase
Binding
BindingMode
PropertyChangedEventManager
UpdateTriggerMode
Конкретный android
CachingViewHolder
ObservableAdapter
ObservableRecyclerAdapter
Особенности iOS
ObservableCollectionViewSource
ObservableTableViewController
ObservableTableViewSource
Вспомогательные методы
Empty
WeakAction
WeakFunc
MVVM Toolkit