MvvmLight からの移行
この記事では、移行を容易にするために MvvmLight Toolkitと MVVM Toolkitの主な違いの一部について説明します。
この記事では特に MvvmLight から MVVM Toolkit への移行に焦点を当てていますが、MVVM Toolkit内で追加の機能強化が行われていることに注意してください。そのため、個々の新しい API のドキュメントを参照することを強くお勧めします。
プラットフォーム API:
ObservableObject
、ObservableRecipient
, , ,RelayCommand
, ,RelayCommand<T>
,AsyncRelayCommand
,AsyncRelayCommand<T>
, ,IRecipient<TMessage>
WeakReferenceMessenger
StrongReferenceMessenger
MessageHandler<TRecipient, TMessage>
IMessenger
IMessengerExtensions
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
と同じ機能Cleanup
をOnDeactivated
提供するために使用する必要があるメソッドを提供します。
OnDeactivated
MVVM Toolkitでは、呼び出されたときに登録されているすべてのメッセンジャー イベントの登録も解除されます。
// MvvmLight
Cleanup();
// Toolkit.Mvvm
OnDeactivated();
とメソッドはOnActivated
OnDeactivated
、次のようにCleanup
既存のソリューションから呼び出すことができます。
ただし、これらのメソッドの ObservableRecipient
設定時にこれらのメソッドの呼び出しも制御するプロパティが公開 IsActive
されます。
ViewModelBase プロパティ
MessengerInstance
MessengerInstance
には、名前が変更された直接置換があります Messenger
。
// MvvmLight
IMessenger messenger = MessengerInstance;
// Toolkit.Mvvm
IMessenger messenger = Messenger;
注意
プロパティWeakReferenceMessenger.Default
のMessenger
既定値は、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は、これらのシナリオに対して強化された実装を公開します。
既存RelayCommand
AsyncRelayCommand
のものを、非同期目的で構築されたものに置き換えることができます。
// 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