MvvmLight からの移行

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

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

プラットフォーム API:ObservableObjectObservableRecipientRelayCommandRelayCommand<T>AsyncRelayCommandAsyncRelayCommand<T>IMessengerWeakReferenceMessengerStrongReferenceMessengerIRecipient<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 ツールキットは、同様の 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) は直接置換を行いません。

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

// 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 ツールキットは、同様の機能を提供する 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 メソッドが呼び出されるためです。

また、基底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) は直接置換を行いません。

パフォーマンスを向上させるには、代わりに SetProperty<T>(ref T, T, bool, string) キーワードを使用して MVVM Toolkit の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 プロパティを介して送信されたメッセージは、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には、OnDeactivatedと同じ機能を提供するために使用する必要があるCleanupメソッドが用意されています。

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

// 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 ツールキットは、プラットフォームに依存しないように設計されています。

// MvvmLight
var isInDesignMode = IsInDesignMode;

// MVVM Toolkit
// No direct replacement, remove

ViewModelBase の静的プロパティ

IsInDesignModeStatic

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

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

// MvvmLight
var isInDesignMode = ViewModelBase.IsInDesignModeStatic;

// MVVM Toolkit
// No direct replacement, remove

RelayCommand の移行

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

MVVM ツールキットは、RelayCommand システム インターフェイスを利用して同様の機能を提供するICommand型を提供します。

現在のソリューションで使用されている場合に実行する必要がある移行の一覧を次に示します。 メソッドまたはプロパティが一覧にない場合は、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 ツールキットは、これらのシナリオに対して改善された実装を公開します。

既存の 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> を移行中

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

MVVM ツールキットは、RelayCommand<T> システム インターフェイスを利用して同様の機能を提供するICommand型を提供します。

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

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

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

// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;

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

現在、非同期アクションで MvvmLight 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

MVVM Toolkit の IoC 実装には、依存関係の挿入を単独で処理するための組み込みロジックが含まれていないため、サード パーティ製ライブラリを自由に使用して、IServiceProvider メソッドに渡すことができるIoc.ConfigureServices インスタンスを取得できます。 次の例では、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());
}

依存関係の解決

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

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

MVVM ツールキットに移行すると、次の方法で同じことが実現されます。

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

依存関係の削除

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

SimpleIoc.Default.Unregister<INavigationService>();

MVVM Toolkit Ioc 実装を使用して依存関係を削除するための直接的な置き換えはありません。

推奨コンストラクター

MvvmLight の SimpleIocに依存関係を登録する場合、複数のコンストラクターを持つユーザーに PreferredConstructor 属性を提供するオプションがクラスに用意されています。

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

移行中Messenger

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

MVVM Toolkit には、同様の機能を提供する 2 つのメッセンジャー実装 (WeakReferenceMessengerStrongReferenceMessengerこちらのドキュメントを参照) が用意されています。主な違いをいくつか以下に示します。

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

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

// 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> インターフェイスを使用することもできます ( messenger ドキュメントで詳しく説明します)。これにより、登録が自動的に行われ、詳細度が低くなります。

Note

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

さらに、この例と以下の例は、MessengerObservableRecipientプロパティを使用するだけです。 コード内の他の場所からメッセンジャーインスタンスに静的にアクセスするだけの場合は、同じ例も適用されます。唯一の違いは、 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)の機能は、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 ツールキットの 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)の機能は、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 ツールキットの 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 ツールキットの Reset() メソッドを使用して実現できます。

MvvmLight の実装ではインスタンスが null になるのとは異なり、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 メソッドに直接置き換わるものはありません。

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

// MvvmLight
Messenger.Reset();

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

Messenger の静的プロパティ

Default

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

// MvvmLight
IMessenger messenger = Messenger.Default;

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

Helpers

  • Empty
  • WeakAction
  • WeakFunc