MvvmLight からの移行
この記事では、移行を容易にするための MvvmLight Toolkit と MVVM Toolkit のいくつかの主な違いの概要について説明します。
この記事では、特に MvvmLight から MVVM Toolkit への移行に重点を置いていますが、MVVM Toolkit 内で行われた追加の機能強化があることに注意してください。そのため、個々の新しい API についてはドキュメントを参照することを強くお勧めします。
プラットフォーム API:
ObservableObject
、ObservableRecipient
、RelayCommand
、RelayCommand<T>
、AsyncRelayCommand
、AsyncRelayCommand<T>
、IMessenger
、WeakReferenceMessenger
、StrongReferenceMessenger
、IRecipient<TMessage>
、MessageHandler<TRecipient, TMessage>
、IMessengerExtensions
MVVM Toolkit のインストール
MVVM Toolkit を利用するには、まず、既存の .NET アプリケーションに最新の NuGet パッケージをインストールする必要があります。
.NET CLI 経由でインストールする
dotnet add package CommunityToolkit.Mvvm --version 8.1.0
PackageReference 経由でインストールする
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.1.0" />
ObservableObject の移行
次の手順では、MvvmLight Toolkit の ObservableObject
を利用する既存のコンポーネントの移行に重点を置いています。 MVVM Toolkit には、同様の ObservableObject
型が用意されています。
ここでの最初の変更は、コンポーネント内でのディレクティブを使用したスワップです。
// MvvmLight
using GalaSoft.MvvmLight;
// MVVM Toolkit
using CommunityToolkit.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);
// 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)
には、同様のメソッド シグネチャの置き換えがありません。
ただし、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)
には、直接の置き換えがありません。
パフォーマンスを向上させるために、代わりに nameof
キーワードを使用して、RaisePropertyChanged<T>(Expression)
を Toolkit の OnPropertyChanged(string)
に置き換えることをお勧めします (または、前に説明したように、ターゲット プロパティがこのメソッドを呼び出しているものと同じであるため、名前を自動的に推論できる場合は、パラメーターなしで)。
// MvvmLight
RaisePropertyChanged(() => MyProperty);
// MVVM Toolkit
OnPropertyChanged(nameof(MyProperty));
VerifyPropertyName(string)
VerifyPropertyName(string)
メソッドの直接の置き換えはないため、これを使用しているコードはすべて、変更または削除する必要があります。
MVVM Toolkit から除外された理由は、あるプロパティに対する 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 の移行
次の手順では、MvvmLight Toolkit の ViewModelBase
を利用する既存のコンポーネントの移行に重点を置いています。
MVVM Toolkit には、同様の機能を提供する 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);
// MVVM Toolkit
SetProperty(ref this.myProperty, value, true);
MVVM 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));
// MVVM Toolkit
SetProperty(ref this.myProperty, value, true);
Set<T>(Expression, ref T, T, bool)
Set<T>(Expression, ref T, T, bool)
には、直接の置き換えがありません。
パフォーマンスを向上させるために、代わりに nameof
キーワードを使用して、これを MVVM Toolkit の SetProperty<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)
には、名前の変更を必要としない直接の置き換えがあります。
// MvvmLight
Broadcast<MyObject>(oldValue, newValue, nameof(MyProperty));
// MVVM Toolkit
Broadcast(oldValue, newValue, nameof(MyProperty));
Broadcast
メソッドを呼び出すときに Messenger
プロパティ経由で送信されるメッセージには、MVVM Toolkit ライブラリ内に PropertyChangedMessage
の直接の置き換えがあることに注意してください。
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
には、Cleanup
と同じ機能を提供するために使用する必要がある OnDeactivated
メソッドが用意されています。
MVVM Toolkit の OnDeactivated
も、呼び出されると、登録されているすべてのメッセンジャー イベントを登録解除します。
// MvvmLight
Cleanup();
// MVVM Toolkit
OnDeactivated();
OnActivated
および OnDeactivated
メソッドは、Cleanup
と同様に、既存のソリューションから呼び出すことができることに注意してください。
ただし、ObservableRecipient
は、これらのメソッドへの呼び出しも制御する IsActive
プロパティを公開します (設定されている場合)。
ViewModelBase プロパティ
MessengerInstance
MessengerInstance
には、名前が変更された直接の置き換え Messenger
があります。
// MvvmLight
IMessenger messenger = MessengerInstance;
// MVVM Toolkit
IMessenger messenger = Messenger;
Note
Messenger
プロパティの既定値は、MVVM Toolkit の標準の弱参照メッセンジャー実装である WeakReferenceMessenger.Default
インスタンスになります。 これは、別の IMessenger
インスタンスを ObservableRecipient
コンストラクターに挿入するだけでカスタマイズできます。
IsInDesignMode
IsInDesignMode
プロパティの直接の置き換えはないため、これを使用しているコードはすべて、変更または削除する必要があります。
MVVM Toolkit から除外された理由は、IsInDesignMode
プロパティによってプラットフォーム固有の実装が公開されたためです。 MVVM Toolkit は、プラットフォームに依存しないように設計されています。
// MvvmLight
var isInDesignMode = IsInDesignMode;
// MVVM Toolkit
// No direct replacement, remove
ViewModelBase 静的プロパティ
IsInDesignModeStatic
IsInDesignModeStatic
プロパティの直接の置き換えはないため、これを使用しているコードはすべて、変更または削除する必要があります。
MVVM Toolkit から除外された理由は、IsInDesignMode
プロパティによってプラットフォーム固有の実装が公開されたためです。 MVVM Toolkit は、プラットフォームに依存しないように設計されています。
// MvvmLight
var isInDesignMode = ViewModelBase.IsInDesignModeStatic;
// MVVM Toolkit
// No direct replacement, remove
RelayCommand の移行
次の手順では、MvvmLight Toolkit の RelayCommand
を利用する既存のコンポーネントの移行に重点を置いています。
MVVM Toolkit には、ICommand
システム インターフェイスを利用して同様の機能を提供する RelayCommand
型が用意されています。
現在のソリューションで使用されている場合に実行する必要がある移行の一覧を次に示します。 メソッドまたはプロパティが一覧にない場合は、MVVM Toolkit 内に同じ名前を持つ直接の置き換えがあるため、変更は必要ありません。
ここでの最初の変更は、コンポーネント内でのディレクティブを使用したスワップです。
// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;
Note
MvvmLight は、弱い参照を使用して、コマンドとそれに関連付けられているクラスから呼び出されたアクションの間のリンクを確立します。 これは MVVM Toolkit 実装では必要なく、この省略可能なパラメーターがいずれかのコンストラクターで true
に設定されている場合、これは削除されます。
非同期アクションでの RelayCommand の使用
現在、非同期アクションで MvvmLight の RelayCommand
実装を使用している場合、MVVM Toolkit は、これらのシナリオのための機能強化された実装を公開します。
単純に、既存の 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 Toolkit の NotifyCanExecuteChanged()
メソッドで実現できます。
// MvvmLight
var command = new RelayCommand(OnCommand);
command.RaiseCanExecuteChanged();
// MVVM Toolkit
var command = new RelayCommand(OnCommand);
command.NotifyCanExecuteChanged();
RelayCommand<T>
の移行
次の手順では、MvvmLight Toolkit の RelayCommand<T>
を利用する既存のコンポーネントの移行に重点を置いています。
MVVM Toolkit には、ICommand
システム インターフェイスを利用して同様の機能を提供する RelayCommand<T>
型が用意されています。
現在のソリューションで使用されている場合に実行する必要がある移行の一覧を次に示します。 メソッドまたはプロパティが一覧にない場合は、MVVM Toolkit 内に同じ名前を持つ直接の置き換えがあるため、変更は必要ありません。
ここでの最初の変更は、コンポーネント内でのディレクティブを使用したスワップです。
// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;
非同期アクションでの RelayCommand
の使用
現在、非同期アクションで MvvmLight の RelayCommand<T>
実装を使用している場合、MVVM Toolkit は、これらのシナリオのための機能強化された実装を公開します。
単純に、既存の 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 Toolkit の NotifyCanExecuteChanged()
メソッドで実現できます。
// MvvmLight
var command = new RelayCommand<string>(OnCommand);
command.RaiseCanExecuteChanged();
// MVVM Toolkit
var command = new RelayCommand<string>(OnCommand);
command.NotifyCanExecuteChanged();
SimpleIoc
の移行
MVVM Toolkit の IoC 実装には、依存関係の挿入を独自に処理するための組み込みロジックが含まれていないため、自由にサード パーティ ライブラリを使用して、後で Ioc.ConfigureServices
メソッドに渡すことができる IServiceProvider
インスタンスを取得できます。 後の例では、Microsoft.Extensions.DependencyInjection
ライブラリの ServiceCollection
型が使用されます。
これは、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
を利用する既存のコンポーネントの移行に重点を置いています。
MVVM Toolkit には、同様の機能を提供する 2 つのメッセンジャー実装 (WeakReferenceMessenger
と StrongReferenceMessenger
。このドキュメントを参照) が用意されています。いくつかの主な違いを以下に詳細に示します。
現在のソリューションで使用されている場合に実行する必要がある移行の一覧を次に示します。
ここでの最初の変更は、コンポーネント内でのディレクティブを使用したスワップです。
// MvvmLight
using GalaSoft.MvvmLight.Messaging;
// MVVM Toolkit
using CommunityToolkit.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);
// MVVM Toolkit
Messenger.Register<MyViewModel, MyMessage>(this, static (r, m) => r.OnMyMessageReceived(m));
この署名の理由は、メッセンジャーが弱い参照を使用して、受信者を適切に追跡したり、受信者自体をキャプチャするためのクロージャの作成を回避したりできるようにするためです。 つまり、入力受信者はラムダ式に入力として渡されるため、ラムダ式自体でキャプチャする必要はありません。 また、これにより、同じハンドラーを割り当てなしで複数回を再利用できるため、より効率的なコードが生成されます。 これは、ハンドラーを登録するためにサポートされている方法の 1 つにすぎず、代わりに IRecipient<TMessage>
インターフェイスを使用することもできることに注意してください (詳細については、メッセンジャーのドキュメントを参照)。これにより、登録が自動的でかつ簡潔になります。
Note
ラムダ式の static
修飾子には C# 9 が必要であり、これは省略可能です。 それをここで使用して、受信者や他の何らかのメンバーを誤ってキャプチャし、そのためにクロージャの割り当てを発生させていないことを確認すると有効ですが、これは必須ではありません。 C# 9 を使用できない場合は、ここの static
だけを削除し、単純にコードが何もキャプチャしていないことを注意深く確認するようにできます。
さらに、この例と以下の例では、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 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>)
派生したメッセージの種類に対してもメッセージの受信をサポートできる、この登録メカニズムの直接の置き換えはありません。 この変更は、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)
の機能は、MVVM Toolkit の IMessenger
拡張メソッド Send<TMessage>(TMessage)
で実現できます。
// MvvmLight
Messenger.Default.Send<MyMessage>(new MyMessage());
Messenger.Default.Send(new MyMessage());
// MVVM Toolkit
Messenger.Send(new MyMessage());
送信されているメッセージにパラメーターなしのコンストラクターがある上記のシナリオでは、MVVM Toolkit に、この形式でメッセージを送信するための簡略化された拡張機能があります。
// MVVM Toolkit
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));
// MVVM Toolkit
Messenger.Send(new MyMessage(), nameof(MyViewModel));
Unregister(object)
Unregister(object)
の機能は、MVVM Toolkit の UnregisterAll(object)
メソッドで実現できます。
// MvvmLight
Messenger.Default.Unregister(this);
// MVVM Toolkit
Messenger.UnregisterAll(this);
Unregister<TMessage>(object)
Unregister<TMessage>(object)
の機能は、MVVM Toolkit の IMessenger
拡張メソッド Unregister<TMessage>(object)
で実現できます。
// MvvmLight
Messenger.Default.Unregister<MyMessage>(this);
// MVVM Toolkit
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);
// MVVM Toolkit
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));
// MVVM Toolkit
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);
// MVVM Toolkit
Messenger.Unregister<MyMessage, string>(this, nameof(MyViewModel));
Cleanup()
Cleanup
メソッドには、MVVM Toolkit 内に同じ名前を持つ直接の置き換えがあります。 このメソッドは、弱い参照を使用するメッセンジャーが使用されている場合にのみ役立ちますが、そのメッセンジャーの使用中に内部状態が既に自動的に切り捨てられているため、このメソッドが呼び出されたときに StrongReferenceMessenger
型は単純に何も実行しないことに注意してください。
// MvvmLight
Messenger.Default.Cleanup();
// MVVM Toolkit
Messenger.Cleanup();
RequestCleanup()
MVVM Toolkit には、RequestCleanup
メソッドの直接の置き換えはありません。 MvvmLight のコンテキストでは、この実装が弱い参照を利用するため、RequestCleanup
は、有効でなくなった登録を削除するための要求を開始するために使用されます。
RequestCleanup
メソッドの呼び出しはすべて、削除するか、または Cleanup
に置き換えることができます。
// MvvmLight
Messenger.Default.RequestCleanup();
// MVVM Toolkit
// No direct replacement, remove
ResetAll()
ResetAll()
の機能は、MVVM Toolkit の Reset()
メソッドで実現できます。
インスタンスを null 値として出力する MvvmLight の実装とは異なり、MVVM Toolkit は登録されているマップをクリアします。
// MvvmLight
Messenger.Default.ResetAll();
// MVVM Toolkit
Messenger.Reset();
Messenger 静的メソッド
OverrideDefault(IMessenger)
MVVM Toolkit には、OverrideDefault(IMessenger)
メソッドの直接の置き換えはありません。
IMessenger
のカスタム実装を使用するには、そのカスタム実装をサービス登録に依存関係の挿入として登録するか、または静的インスタンスを手動で構築し、これを必要に応じて渡します。
// MvvmLight
Messenger.OverrideDefault(new Messenger());
// MVVM Toolkit
// No direct replacement
Reset()
MVVM Toolkit には、静的な Reset
メソッドの直接の置き換えはありません。
同じ機能は、いずれかのメッセンジャーの種類の静的な Default
インスタンスの Reset
メソッドを呼び出すことによって実現できます。
// MvvmLight
Messenger.Reset();
// MVVM Toolkit
WeakReferenceMessenger.Default.Reset();
Messenger 静的プロパティ
Default
Default
には、既存の実装の変更を必要としない直接の置き換え Default
があります。
// MvvmLight
IMessenger messenger = Messenger.Default;
// MVVM Toolkit
IMessenger messenger = WeakReferenceMessenger.Default;
メッセージの種類の移行
MvvmLight Toolkit で提供されているメッセージの種類は、開発者が必要に応じて操作するための基礎として設計されています。
MVVM Toolkit には、いくつかの代替手段が用意されていますが、これらのメッセージの種類の直接の置き換えはありません。 使用可能なメッセージの種類を調べることをお勧めします。
あるいは、ソリューションで MvvmLight のメッセージの種類を利用している場合は、これらを独自のコードベースに簡単に移植できます。
プラットフォーム固有のコンポーネントの移行
現在の MVVM Toolkit 実装には、MvvmLight Toolkit に存在するプラットフォーム固有のコンポーネントの置き換えはありません。
次のコンポーネントとそれに関連付けられているヘルパーまたは拡張メソッドには置き換えがないため、いつ 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
MVVM Toolkit