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 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 つのメッセンジャー実装 (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> インターフェイスを使用することもできることに注意してください (詳細については、メッセンジャーのドキュメントを参照)。これにより、登録が自動的でかつ簡潔になります。

Note

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

さらに、この例と以下の例では、ObservableRecipientMessenger プロパティだけを使用しています。 単に、メッセンジャー インスタンスにコード内のほかのどこからでも静的にアクセスしたい場合にも、同じ例が適用されます。唯一の違いは、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