MvvmLight からの移行

この記事では、移行を容易にするために MvvmLight Toolkitと MVVM Toolkitの主な違いの一部について説明します。

この記事では特に MvvmLight から MVVM Toolkit への移行に焦点を当てていますが、MVVM Toolkit内で追加の機能強化が行われていることに注意してください。そのため、個々の新しい API のドキュメントを参照することを強くお勧めします。

プラットフォーム API:ObservableObjectObservableRecipient, , , RelayCommand, , RelayCommand<T>, AsyncRelayCommand, AsyncRelayCommand<T>, , IRecipient<TMessage>WeakReferenceMessengerStrongReferenceMessengerMessageHandler<TRecipient, TMessage>IMessengerIMessengerExtensions

WCT MVVM Toolkitのインストール

Windows Community Toolkit MVVM フレームワークを利用するには、まず、既存のWindows アプリケーションに最新のNuGet パッケージをインストールする必要があります。

.NET CLI を使用したインストール

dotnet add package Microsoft.Toolkit.Mvvm --version 7.0.0

PackageReference 経由でインストールする

<PackageReference Include="Microsoft.Toolkit.Mvvm" Version="7.0.0" />

ObservableObject の移行

次の手順では、MvvmLight Toolkitを利用する既存のObservableObjectコンポーネントの移行に重点を置いて説明します。 Windows Community Toolkit MVVM フレームワークは、同様の型をObservableObject提供します。

ここでの最初の変更は、コンポーネントでディレクティブを使用してスワップすることです。

// MvvmLight
using GalaSoft.MvvmLight;

// Toolkit.Mvvm
using Microsoft.Toolkit.Mvvm.ComponentModel;

現在のソリューションで使用されている場合に実行する必要がある移行の一覧を次に示します。

ObservableObject メソッド

Set<T>(Expression, ref T, T)

Set(Expression, ref T, T) は、同様のメソッド シグネチャの置換を持っていません。

ただし、 SetProperty(ref T, T, string) 同じ機能にパフォーマンス上の利点が追加されています。

// MvvmLight
Set(() => MyProperty, ref this.myProperty, value);

// Toolkit.Mvvm
SetProperty(ref this.myProperty, value);

stringメソッドが呼び出し元のメンバー名から推論されるため、プロパティのセッターからメソッドが呼び出されている場合は、パラメーターは必要ありません。次に示すように注意してください。 メソッドが呼び出されているプロパティとは異なるプロパティを呼び出す場合は、演算子を使用nameofして呼びSetProperty出すことができます。これは、ハードコーディングされた名前を持たないためにコードのエラーを減らすのに役立ちます。 次に例を示します。

SetProperty(ref this.someProperty, value, nameof(SomeProperty));

Set<T>(string, ref T, T)

Set<T>(string, ref T, T) は、同様のメソッド シグネチャの置換を持っていません。

ただし、 SetProperty<T>(ref T, T, string) 順序が変更されたパラメーターでも同じ機能が提供されます。

// MvvmLight
Set(nameof(MyProperty), ref this.myProperty, value);

// Toolkit.Mvvm
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));

// Toolkit.Mvvm
SetProperty(ref this.myProperty, value);

RaisePropertyChanged(string)

RaisePropertyChanged(string) には、名前が変更された直接置換があります OnPropertyChanged(string)

// MvvmLight
RaisePropertyChanged(nameof(MyProperty));

// Toolkit.Mvvm
OnPropertyChanged();

同様 SetPropertyに、現在のプロパティの名前は、メソッドによって自動的に OnPropertyChanged 推論されます。 このメソッドを使用して別のプロパティのイベントを PropertyChanged 手動で発生させる場合は、演算子をもう一度使用してそのプロパティの名前を nameof 手動で指定することもできます。 次に例を示します。

OnPropertyChanged(nameof(SomeProperty));

RaisePropertyChanged<T>(Expression)

RaisePropertyChanged<T>(Expression) は直接置換を行いません。

パフォーマンスを向上させるには、代わりにキーワードを使用nameofするToolkitOnPropertyChanged(string)に置き換えることをRaisePropertyChanged<T>(Expression)お勧めします (または、ターゲット プロパティがメソッドを呼び出すプロパティと同じである場合はパラメーターを指定せずに、前述のように名前を自動的に推論できます)。

// MvvmLight
RaisePropertyChanged(() => MyProperty);

// Toolkit.Mvvm
OnPropertyChanged(nameof(MyProperty));

VerifyPropertyName(string)

メソッドを直接置き換える VerifyPropertyName(string) 必要はなく、これを使用するコードは変更または削除する必要があります。

MVVM Toolkitからの省略の理由は、プロパティにキーワードをnameof使用すると、そのキーワードが存在することが確認されるためです。 MvvmLight がビルドされたとき、 nameof キーワードは使用できませんでした。このメソッドを使用して、プロパティがオブジェクトに存在することを確認しました。

// MvvmLight
VerifyPropertyName(nameof(MyProperty));

// Toolkit.Mvvm
// No direct replacement, remove

ObservableObject プロパティ

PropertyChangedHandler

PropertyChangedHandler は直接置換を行いません。

イベント ハンドラーを使用してプロパティ変更イベントを PropertyChanged 発生するには、代わりにメソッドを OnPropertyChanged 呼び出す必要があります。

// MvvmLight
PropertyChangedEventHandler handler = PropertyChangedHandler;

// Toolkit.Mvvm
OnPropertyChanged();

ViewModelBase の移行

次の手順では、MvvmLight Toolkitを利用する既存のViewModelBaseコンポーネントの移行に重点を置いて説明します。

Windows Community Toolkit MVVM フレームワークは、同様の機能をObservableRecipient提供する型を提供します。

現在のソリューションで使用されている場合に実行する必要がある移行の一覧を次に示します。

ViewModelBase メソッド

Set<T>(string, ref T, T, bool)

Set<T>(string, ref T, T, bool) は、同様のメソッド シグネチャの置換を持っていません。

ただし、 SetProperty<T>(ref T, T, bool, string) 順序が変更されたパラメーターでも同じ機能が提供されます。

// MvvmLight
Set(nameof(MyProperty), ref this.myProperty, value, true);

// Toolkit.Mvvm
SetProperty(ref this.myProperty, value, true);

値パラメーターとブロードキャストブール値パラメーターは、Toolkitの実装では省略可能ではなく、このメソッドを使用するために指定する必要があります。 この変更の理由は、このメソッドを呼び出すときにブロードキャスト パラメーターを省略すると、既定で ObservableObject の SetProperty メソッドが呼び出されるためです。

また、基底ObservableObjectクラスのstringメソッドと同様に、呼び出し元メンバー名から推論されるため、メソッドがプロパティのセッターから呼び出される場合は、パラメーターは必要ありません。

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));

// Toolkit.Mvvm
SetProperty(ref this.myProperty, value, true);

Set<T>(Expression, ref T, T, bool)

Set<T>(Expression, ref T, T, bool) は直接置換を行いません。

パフォーマンスを向上させるには、代わりにキーワードを使用nameofするToolkitSetProperty<T>(ref T, T, bool, string)に置き換えることをお勧めします。

// MvvmLight
Set<MyObject>(() => MyProperty, ref this.myProperty, value, true);

// Toolkit.Mvvm
SetProperty(ref this.myProperty, value, true);

Broadcast<T>(T, T, string)

Broadcast<T>(T, T, string) には、名前の変更を必要としない直接の置換があります。

// MvvmLight
Broadcast<MyObject>(oldValue, newValue, nameof(MyProperty));

// Toolkit.Mvvm
Broadcast(oldValue, newValue, nameof(MyProperty));

メソッドの呼び出しBroadcast時にプロパティをMessenger介して送信されるメッセージは、Toolkitの MVVM ライブラリ内に直接置き換えられますPropertyChangedMessage

RaisePropertyChanged<T>(string, T, T, bool)

メソッドの直接の RaisePropertyChanged<T>(string, T, T, bool) 置き換えはありません。

最も簡単な方法は、この機能を実現するために呼び出 OnPropertyChanged し、その後呼び出 Broadcast す方法です。

// MvvmLight
RaisePropertyChanged<MyObject>(nameof(MyProperty), oldValue, newValue, true);

// Toolkit.Mvvm
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);

// Toolkit.Mvvm
OnPropertyChanged(nameof(MyProperty));
Broadcast(oldValue, newValue, nameof(MyProperty));

ICleanup.Cleanup()

インターフェイスに直接置き換え ICleanup はありません。

ただし、次ObservableRecipientと同じ機能CleanupOnDeactivated提供するために使用する必要があるメソッドを提供します。

OnDeactivatedMVVM Toolkitでは、呼び出されたときに登録されているすべてのメッセンジャー イベントの登録も解除されます。

// MvvmLight
Cleanup();

// Toolkit.Mvvm
OnDeactivated();

とメソッドはOnActivatedOnDeactivated、次のようにCleanup既存のソリューションから呼び出すことができます。

ただし、これらのメソッドの ObservableRecipient 設定時にこれらのメソッドの呼び出しも制御するプロパティが公開 IsActive されます。

ViewModelBase プロパティ

MessengerInstance

MessengerInstance には、名前が変更された直接置換があります Messenger

// MvvmLight
IMessenger messenger = MessengerInstance;

// Toolkit.Mvvm
IMessenger messenger = Messenger;

注意

プロパティWeakReferenceMessenger.DefaultMessenger既定値は、MVVM Toolkitの標準的な弱参照メッセンジャー実装であるインスタンスになります。 これは、コンストラクターに別 IMessenger のインスタンス ObservableRecipient を挿入するだけでカスタマイズできます。

IsInDesignMode

プロパティを直接置き換える IsInDesignMode 必要はなく、これを使用するコードは変更または削除する必要があります。

MVVM Toolkitからの省略の理由は、プロパティがプラットフォーム固有のIsInDesignMode実装を公開したからです。 MVVM Toolkitは、プラットフォームに依存しないように設計されています。

// MvvmLight
var isInDesignMode = IsInDesignMode;

// Toolkit.Mvvm
// No direct replacement, remove

ViewModelBase の静的プロパティ

IsInDesignModeStatic

プロパティを直接置き換える IsInDesignModeStatic 必要はなく、これを使用するコードは変更または削除する必要があります。

MVVM Toolkitからの省略の理由は、プロパティがプラットフォーム固有のIsInDesignMode実装を公開したからです。 MVVM Toolkitは、プラットフォームに依存しないように設計されています。

// MvvmLight
var isInDesignMode = ViewModelBase.IsInDesignModeStatic;

// Toolkit.Mvvm
// No direct replacement, remove

RelayCommand の移行

次の手順では、MvvmLight Toolkitを利用する既存のRelayCommandコンポーネントの移行に重点を置いて説明します。

Windows Community Toolkit MVVM フレームワークは、システム インターフェイスをRelayCommand利用して同様の機能を提供する型をICommand提供します。

現在のソリューションで使用されている場合に実行する必要がある移行の一覧を次に示します。 メソッドまたはプロパティが一覧にない場合は、MVVM Toolkitに同じ名前の直接置換があり、変更は必要ありません。

ここでの最初の変更は、コンポーネントでディレクティブを使用してスワップすることです。

// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;

// Toolkit.Mvvm
using Microsoft.Toolkit.Mvvm.Input;

注意

MvvmLight では、弱参照を使用して、コマンドと、関連付けられたクラスから呼び出されたアクションの間のリンクを確立します。 これは MVVM Toolkit実装では必要ありません。この省略可能なパラメーターがいずれかのコンストラクターで設定trueされている場合、これは削除されます。

非同期アクションでの RelayCommand の使用

現在、非同期アクションで MvvmLight RelayCommand 実装を使用している場合、MVVM Toolkitは、これらのシナリオに対して強化された実装を公開します。

既存RelayCommandAsyncRelayCommandのものを、非同期目的で構築されたものに置き換えることができます。

// MvvmLight
var command = new RelayCommand(() => OnCommandAsync());
var command = new RelayCommand(async () => await OnCommandAsync());

// Toolkit.Mvvm
var asyncCommand = new AsyncRelayCommand(OnCommandAsync);

RelayCommand メソッド

RaiseCanExecuteChanged()

の機能RaiseCanExecuteChanged()は、MVVM ToolkitのNotifyCanExecuteChanged()方法で実現できます。

// MvvmLight
var command = new RelayCommand(OnCommand);
command.RaiseCanExecuteChanged();

// Toolkit.Mvvm
var command = new RelayCommand(OnCommand);
command.NotifyCanExecuteChanged();

移行 RelayCommand<T>

次の手順では、MvvmLight Toolkitを利用する既存のRelayCommand<T>コンポーネントの移行に重点を置いて説明します。

Windows Community Toolkit MVVM フレームワークは、システム インターフェイスをRelayCommand<T>利用して同様の機能を提供する型をICommand提供します。

現在のソリューションで使用されている場合に実行する必要がある移行の一覧を次に示します。 メソッドまたはプロパティが一覧にない場合は、MVVM Toolkitに同じ名前の直接置換があり、変更は必要ありません。

ここでの最初の変更は、コンポーネントでディレクティブを使用してスワップすることです。

// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;

// Toolkit.Mvvm
using Microsoft.Toolkit.Mvvm.Input;

非同期アクションでの使用RelayCommand

現在、非同期アクションで MvvmLight RelayCommand<T> 実装を使用している場合、MVVM Toolkitは、これらのシナリオに対して強化された実装を公開します。

既存RelayCommand<T>AsyncRelayCommand<T>のものを、非同期目的で構築されたものに置き換えることができます。

// MvvmLight
var command = new RelayCommand<string>(async () => await OnCommandAsync());

// Toolkit.Mvvm
var asyncCommand = new AsyncRelayCommand<string>(OnCommandAsync);

RelayCommand<T> メソッド

RaiseCanExecuteChanged()

の機能RaiseCanExecuteChanged()は、MVVM ToolkitのNotifyCanExecuteChanged()方法で実現できます。

// MvvmLight
var command = new RelayCommand<string>(OnCommand);
command.RaiseCanExecuteChanged();

// Toolkit.Mvvm
var command = new RelayCommand<string>(OnCommand);
command.NotifyCanExecuteChanged();

移行 SimpleIoc

MVVM Toolkitの IoC 実装には、依存関係の挿入を独自に処理するための組み込みロジックが含まれていないため、任意のサード パーティ ライブラリを自由に使用して、メソッドに渡すことができるインスタンスをIoc.ConfigureServices取得IServiceProviderできます。 次の例では、ライブラリの ServiceCollection 型が Microsoft.Extensions.DependencyInjection 使用されます。

これは、MvvmLight と MVVM Toolkitの間の最大の変化です。

この実装は、ASP.NET Core アプリケーションで依存関係の挿入を実装した場合に使い慣れていると感じます。

依存関係の登録

MvvmLight を使用すると、これらのシナリオ SimpleIocと同様の依存関係を登録している可能性があります。

public void RegisterServices()
{
  SimpleIoc.Default.Register<INavigationService, NavigationService>();

  SimpleIoc.Default.Register<IDialogService>(() => new DialogService());
}

MVVM Toolkitを使用すると、次のように実現できます。

public void RegisterServices()
{
  Ioc.Default.ConfigureServices(
    new ServiceCollection()
    .AddSingleton<INavigationService, NavigationService>()
    .AddSingleton<IDialogService>(new DialogService())
    .BuildServiceProvider());
}

依存関係の解決

初期化されると、次のようにクラスSimpleIocからサービスをIoc取得できます。

IDialogService dialogService = SimpleIoc.Default.GetInstance<IDialogService>();

MVVM Toolkitに移行すると、次の方法で同じことが実現されます。

IDialogService dialogService = Ioc.Default.GetService<IDialogService>();

依存関係の削除

では SimpleIoc、次のメソッド呼び出しで依存関係の登録を解除します。

SimpleIoc.Default.Unregister<INavigationService>();

MVVM Toolkit実装による依存関係の削除に直接代わるものIocはありません。

優先コンストラクター

MvvmLight に依存関係を登録する場合は、クラスに複数の SimpleIocコンストラクターを持つ属性を PreferredConstructor 指定するオプションがあります。

この属性は、使用されている場所を削除する必要があり、サポートされている場合は、使用しているサード パーティの依存関係挿入ライブラリから任意の属性を使用する必要があります。

移行 Messenger

次の手順では、MvvmLight Toolkitを利用する既存のMessengerコンポーネントの移行に重点を置いています。

Windows Community Toolkit MVVM フレームワークには、同様の機能を提供する 2 つのメッセンジャー実装 (WeakReferenceMessengerおよび、ここに示すドキュメントを参照) が用意されておりStrongReferenceMessenger、いくつかの主な違いを以下に示します。

現在のソリューションで使用されている場合に実行する必要がある移行の一覧を次に示します。

ここでの最初の変更は、コンポーネントでディレクティブを使用してスワップすることです。

// MvvmLight
using GalaSoft.MvvmLight.Messaging;

// Toolkit.Mvvm
using Microsoft.Toolkit.Mvvm.Messaging;

Messenger メソッド

Register<TMessage>(object, Action<TMessage>)

の機能Register<TMessage>(object, Action<TMessage>)は、MVVM ToolkitのIMessenger拡張方法Register<TRecipient, TMessage>(object, MessageHandler<TRecipient, TMessage>)で実現できます。

// MvvmLight
Messenger.Default.Register<MyMessage>(this, this.OnMyMessageReceived);

// Toolkit.Mvvm
Messenger.Register<MyViewModel, MyMessage>(this, static (r, m) => r.OnMyMessageReceived(m));

この署名の理由は、メッセンジャーが脆弱な参照を使用して受信者を適切に追跡し、受信者自体をキャプチャするためのクロージャを作成しないようにするためです。 つまり、入力受信者はラムダ式への入力として渡されるため、ラムダ式自体でキャプチャする必要はありません。 これにより、同じハンドラーを割り当てなしで複数回再利用できるため、コードの効率も高くなります。 これはハンドラーを登録するためのサポートされている方法の 1 つに過ぎず、代わりに (メッセンジャー ドキュメントで詳しく説明) インターフェイスを使用IRecipient<TMessage>することもできます。これにより、登録が自動になり、詳細度が低くなります。

注意

ラムダ式の修飾子には static C# 9 が必要であり、省略可能です。 ここで使用すると、受信者やその他のメンバーを誤ってキャプチャし、クロージャの割り当てを引き起こしていないことを確認するのに役立ちますが、必須ではありません。 C# 9 を使用できない場合は、ここで削除 static するだけで、コードで何もキャプチャされないように注意してください。

さらに、この例と以下の例では、 Messenger .ObservableRecipient コード内の他の場所からメッセンジャーインスタンスに静的にアクセスしたい場合は、同じ例も適用されます。唯一の違い Messenger は、例えば置き換える必要がある点です。 WeakReferenceMessenger.Default その代わりに。

Register<TMessage>(object, bool, Action<TMessage>)

派生メッセージの種類に対するメッセージの受信もサポートできる、この登録メカニズムに直接代わるものはありません。 実装ではリフレクションを使用してそのパフォーマンス上の Messenger 利点を実現しないことを目的とするため、この変更は意図的です。

または、この機能を実現するために実行できるオプションがいくつかあります。

  • カスタム IMessenger 実装を作成します。
  • 共有ハンドラーを使用して追加のメッセージの種類を登録すると、その型がチェックされ、適切なメソッドが呼び出されます。
// MvvmLight
Messenger.Default.Register<MyMessage>(this, true, this.OnMyMessageReceived);

// Toolkit.Mvvm
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 ToolkitのRegister<TRecipient, TMessage, TToken>(object, TToken, MessageHandler<TRecipient, TMessage>)方法で実現できます。

// MvvmLight
Messenger.Default.Register<MyMessage>(this, nameof(MyViewModel), this.OnMyMessageReceived);

// Toolkit.Mvvm
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);

// Toolkit.Mvvm
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)は、MVVM ToolkitのIMessenger拡張方法Send<TMessage>(TMessage)で実現できます。

// MvvmLight
Messenger.Default.Send<MyMessage>(new MyMessage());
Messenger.Default.Send(new MyMessage());

// Toolkit.Mvvm
Messenger.Send(new MyMessage());

送信されるメッセージにパラメーターなしのコンストラクターがある上記のシナリオでは、MVVM Toolkitには、この形式でメッセージを送信するための簡略化された拡張機能があります。

// Toolkit.Mvvm
Messenger.Send<MyMessage>();

Send<TMessage>(TMessage, object)

の機能Send<TMessage>(TMessage, object)は、MVVM ToolkitのSend<TMessage, TToken>(TMessage, TToken)方法で実現できます。

// MvvmLight
Messenger.Default.Send<MyMessage>(new MyMessage(), nameof(MyViewModel));
Messenger.Default.Send(new MyMessage(), nameof(MyViewModel));

// Toolkit.Mvvm
Messenger.Send(new MyMessage(), nameof(MyViewModel));

Unregister(object)

の機能Unregister(object)は、MVVM ToolkitのUnregisterAll(object)方法で実現できます。

// MvvmLight
Messenger.Default.Unregister(this);

// Toolkit.Mvvm
Messenger.UnregisterAll(this);

Unregister<TMessage>(object)

の機能Unregister<TMessage>(object)は、MVVM ToolkitのIMessenger拡張方法Unregister<TMessage>(object)で実現できます。

// MvvmLight
Messenger.Default.Unregister<MyMessage>(this);

// Toolkit.Mvvm
Messenger.Unregister<MyMessage>(this);

Unregister<TMessage>(object, Action<TMessage>)

MVVM Toolkit内のUnregister<TMessage>(object, Action<TMessage>)メソッドに直接代わるものはありません。

省略の理由は、メッセージ受信者が指定されたメッセージの種類に対して登録されたハンドラーを 1 つしか持つことができないからです。

MVVM ToolkitのIMessenger拡張メソッドUnregister<TMessage>(object)を使用して、この機能を実現することをお勧めします。

// MvvmLight
Messenger.Default.Unregister<MyMessage>(this, OnMyMessageReceived);

// Toolkit.Mvvm
Messenger.Unregister<MyMessage>(this);

Unregister<TMessage>(object, object)

の機能Unregister<TMessage>(object, object)は、MVVM ToolkitのUnregister<TMessage, TToken>(object, TToken)方法で実現できます。

// MvvmLight
Messenger.Default.Unregister<MyMessage>(this, nameof(MyViewModel));

// Toolkit.Mvvm
Messenger.Unregister<MyMessage, string>(this, nameof(MyViewModel));

Unregister<TMessage>(object, object, Action<TMessage>)

MVVM Toolkit内のUnregister<TMessage>(object, object, Action<TMessage>)メソッドに直接代わるものはありません。

省略の理由は、メッセージ受信者が指定されたメッセージの種類に対して登録されたハンドラーを 1 つしか持つことができないからです。

MVVM ToolkitのUnregister<TMessage, TToken>(object, TToken)方法でこの機能を実現することをお勧めします。

// MvvmLight
Messenger.Default.Unregister<MyMessage>(this, nameof(MyViewModel), OnMyMessageReceived);

// Toolkit.Mvvm
Messenger.Unregister<MyMessage, string>(this, nameof(MyViewModel));

Cleanup()

このメソッドはCleanup、MVVM Toolkit内の同じ名前で直接置換されます。 このメソッドは、弱い参照を使用するメッセンジャーが使用されている場合にのみ役立ちますが、 StrongReferenceMessenger 内部状態はメッセンジャーの使用中に自動的にトリミングされているため、このメソッドが呼び出されると、型は単に何も行いません。

// MvvmLight
Messenger.Default.Cleanup();

// Toolkit.Mvvm
Messenger.Cleanup();

RequestCleanup()

MVVM Toolkit内のRequestCleanupメソッドに直接代わるものはありません。 MvvmLight のコンテキストでは、 RequestCleanup 実装が弱い参照を利用するため、登録を削除する要求を開始するために使用されます。

メソッドの RequestCleanup 呼び出しは、削除することも、次のように Cleanup置き換えることができます。

// MvvmLight
Messenger.Default.RequestCleanup();

// Toolkit.Mvvm
// No direct replacement, remove

ResetAll()

の機能ResetAll()は、MVVM ToolkitのReset()方法で実現できます。

インスタンスを null にする MvvmLight の実装とは異なり、MVVM Toolkitは登録されたマップをクリアします。

// MvvmLight
Messenger.Default.ResetAll();

// Toolkit.Mvvm
Messenger.Reset();

Messenger の静的メソッド

OverrideDefault(IMessenger)

MVVM Toolkit内のOverrideDefault(IMessenger)メソッドに直接代わるものはありません。

のカスタム実装 IMessengerを使用するには、依存関係の挿入のためにサービス登録にカスタム実装を登録するか、静的インスタンスを手動で構築し、必要に応じてこれを渡します。

// MvvmLight
Messenger.OverrideDefault(new Messenger());

// Toolkit.Mvvm
// No direct replacement

Reset()

MVVM Toolkitでは、静的Resetメソッドを直接置き換えはありません。

同じ機能を実現するには、いずれかのメッセンジャー型の静的Defaultインスタンスのメソッドを呼び出Resetします。

// MvvmLight
Messenger.Reset();

// Toolkit.Mvvm
WeakReferenceMessenger.Default.Reset();

Messenger の静的プロパティ

Default

Default には直接置換があり、 Default既存の実装を変更する必要はありません。

// MvvmLight
IMessenger messenger = Messenger.Default;

// Toolkit.Mvvm
IMessenger messenger = WeakReferenceMessenger.Default;

メッセージの種類の移行

MvvmLight ツールキットで提供されるメッセージの種類は、開発者が必要に応じて操作するためのベースとして設計されています。

MVVM Toolkitにはいくつかの代替手段が用意されていますが、これらのメッセージの種類に直接代わるものはありません。 使用可能なメッセージの種類を確認することをお勧めします。

または、ソリューションで MvvmLight メッセージの種類を利用する場合は、これらを独自のコードベースに簡単に移植できます。

プラットフォーム固有のコンポーネントの移行

現在の MVVM Toolkit実装では、MvvmLight ツールキットに存在するプラットフォーム固有のコンポーネントに代わるものはありません。

次のコンポーネントとそれに関連付けられているヘルパー/拡張メソッドには代替機能がないため、MVVM Toolkitに移行する際に考慮する必要があります。

Android/iOS/Windows 固有

  • DialogService
  • DispatcherHelper
  • NavigationService

Android/iOS 固有

  • ActivityBase
  • Binding
  • BindingMode
  • PropertyChangedEventManager
  • UpdateTriggerMode

Android 固有

  • CachingViewHolder
  • ObservableAdapter
  • ObservableRecyclerAdapter

iOS 固有

  • ObservableCollectionViewSource
  • ObservableTableViewController
  • ObservableTableViewSource

ヘルパー

  • Empty
  • WeakAction
  • WeakFunc