Миграция с MvmLight

В этой статье описаны некоторые основные различия между MvvmLight набор средств и MVVM набор средств для упрощения миграции.

Хотя в этой статье основное внимание уделяется миграции с MvmLight на набор средств MVVM, обратите внимание, что в набор средств MVVM были добавлены дополнительные улучшения, поэтому настоятельно рекомендуется ознакомиться с документацией по отдельным новым API.

API платформы:ObservableObject, ObservableRecipientAsyncRelayCommand<T>WeakReferenceMessengerIMessengerStrongReferenceMessengerRelayCommand<T>AsyncRelayCommandRelayCommand, , 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 .

Однако предоставляет ObservableRecipientOnDeactivated метод, который следует использовать для предоставления той же функциональности, что 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 набор средств предоставляет улучшенную реализацию для этих сценариев.

Вы можете просто заменить существующий RelayCommandAsyncRelayCommand на созданный для асинхронных целей.

// 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