sh1’s diary

プログラミング、読んだ本、資格試験、ゲームとか私を記録するところ

C# CommunityToolkit.Mvvm の学習1

WinUI3 でも利用できる MVVM として「MVVM Toolkit」の学習をはじめました。

その内容について、メモします。

MVVM Toolkit のサンプルプログラム

サンプルを実行する際に zip でダウンロードしてしまったときは、次のダウンロードが必要です。(git でやったほうが楽だったと思います)

MVVM-Samples から「msdocs-communitytoolkit」を見れば、必要なブランチのリンクになっているので、その zip をダウンロードします。そのあとは次のとおり:

  1. MVVM-Samples の zip を解凍
  2. msdocs-communitytoolkit に CommunityToolkit の zip の中身を解凍
  3. Visual Studio Installer で UWP を動作させるために必要なものをインストール
  4. 「MvvmSampleUwp.sln」を実行

これでもコンパイルをしてサンプルプログラムを実行できます。

以下は、サンプルプログラムに書かれている内容を(いつでも見直せるように)web 上にメモし直したものになります。

サンプルプログラムの本文はすべて英語なので、日本語訳にした際に雑訳(手抜き)があったり、省略した部分もあります。ご了承ください。「MS Learn」に掲載されている内容もありました。(あとから知りました)

Introduction to the MVVM Toolkit

MVVM Toolkit は、モダンで高速なモジュール MVVM ライブラリです。Windows Community Toolkit の一部であり、以下の原則に基づいて構築されています:

  • プラットフォーム、ランタイムから独立している(依存しない) .NET Standard 2.0、.NET Standard 2.1、.NET 6 (UI フレームワークに依存しない)
  • 簡単に使える&ピックアップ アプリケーションの構造、または、コーディングのパラダイム(枠組み)に厳しい要件がない
  • À la carte(アラカルト) 使用するコンポーネントを自由に選択できる。(アラカルトは、食堂などで客が自由に選んで選択できる一品料理のことで、自由に選択して利用できることを例えている)
  • リファレンスの実装 基本のクラスライブラリに含まれているインターフェースの実装を提供するが、インターフェースを直接使用する具体的な型はない

MVVM Toolkit は Microsoft によって、保守・公開されていて .NET Foundation の一部です。また Microsoft Store など Windows に組み込まれているいくつかのアプリケーションでも使用されています。

このパッケージ(MVVM Toolkit)は、.NET Standard をターゲットにしているので、どのプラットフォームのアプリケーションであっても利用できます:UWP, WinForms, WPF, Xamarin, Uno, .NET Native, .NET Core, .NET Framework, Mono など、どのランタイムでも使用できます。

これらはすべてで動作します。API のサーフェイスはすべて同じなので、共有ライブラリの構築に適しています。

一般に、静的ライブラリは、コンパイル時にリンクされるライブラリのこと。共有ライブラリは、プログラムの実行と同時にメモリ上に展開されるライブラリ。

加えて、MVVM Toolkit は .NET 6 のターゲットもあります。これは、.NET 6 上で実行する際により内部的な最適化を可能にしています。API サーフェイス(上述のとおり)同じなので、NuGet はプロジェクトのプラットフォームでどの API が利用できるのかを心配する必要はありません。

で、MVVM Toolkit パッケージはいつ使うべきなの?

MVVM Toolkit パッケージは MVVM パターンを使用してモダンなアプリケーションを構築するための実装を提供するための、標準的で自己完結型の軽量なコレクション(機能)にアクセスするために利用します。

通常、追加の外部参照を必要としません。多くのユーザーがアプリケーションを構築するには次の型だけで十分です:

  • CommunityToolkit.Mvvm.ComponentModel
    • ObservableObject
    • ObservableRecipient
    • ObservableValidator
  • CommunityToolkit.Mvvm.DependencyInjection
  • CommunityToolkit.Mvvm.Input
    • RelayCommand
    • RelayCommand
    • AsyncRelayCommand
    • AsyncRelayCommand
    • IRelayCommand
    • IRelayCommand
    • IAsyncRelayCommand
    • IAsyncRelayCommand
  • CommunityToolkit.Mvvm.Messaging
    • IMessenger
    • WeakReferenceMessenger
    • IRecipient
    • MessageHandler<TRecipient, TMessage>
  • CommunityToolkit.Mvvm.Messaging.Messages
    • ProperyChangedMessage
    • RequestMessage
    • AsyncRequestMessage
    • CollectionRequestMessage
    • AsyncCollectionRequestMessage
    • ValueChangedMessage

MVVM Toolkit パッケージは、可能な限り柔軟性を提供することを目的にしているので、開発者はどのコンポーネントを使うのか自由に選択することができます。

すべての型は疎結合であって、使用するものだけを含めればいいです。あなたのニーズにあわせて最適な方法で組み合わせてください。

MVVM Source generators

バージョン 8.0 から MVVM Toolkit には新しく Roslyn ソースジェネレータが含まれることになり MVVM を使用するコードを書く際のボイラープレート(繰り返し出てくる定型のコードブロックのこと)を大幅に削減しています。

これによって、observable プロパティやコマンドなどをセットアップする手間を簡単化できます。ソースジェネレーターについて知りたい人は「こちら」をご確認ください。これは、ソースジェネレーターがどのように動作するのか簡単化したものです。

コードを書いているときに、MVVM Toolkit のジェネレーターが(舞台裏で)追加のコードを生成します。このコードは、コンパイルされて、あなたのアプリケーションに含まれることになるので、最終的にはあなたがマニュアルで面倒なボイラープレートコードを書いた場合とまったく同じですが、その面倒な作業はすべてする必要ありません!🎉

例えば、observable プロパティをセットアップするなら:

private string? name;

public string? Name
{
    get => name;
    set => SetProperty(ref name, value);
}

単純な属性(ObservableProperty)で同じように表現できます:

[ObservableProperty]
private string? name;

コマンドを作ったら(ふつう)こうなる:

private void SayHello()
{
    Console.WriteLine("Hello");
}

private ICommand? sayHelloCommand;

public ICommand SayHelloCommand => sayHelloCommand ??= new RelayCommand(SayHello);

(RelayCommand)同じように表現できる:

[RelayCommand]
private void SayHello()
{
    Console.WriteLine("Hello");
}

.NET 6 からの新しい MVVM ソースジェネレーターを使えば、これらのことが可能になり、ほかにも多くのことができます!🙌

Note: ソースジェネレーターは、MVVM Toolkit の機能と独立して使用することができます。必要に応じて、ソースジェネレーターの書き方と以前の書き方を組み合わせたり、混在して使用することができます。例えば、ソースジェネレーターを徐々に使い始めて、すこしずつ冗長性を減らすのも自由だし、プロジェクト全体、または、アプリケーションで常にどちらかのアプローチを採用しなければならない、といった義務は無いということ。

次のドキュメントでは、MVVM ジェネレーターにどのような機能が含まれていて、どのように使用されているのかを説明しています:

  • CommunityToolkit.Mvvm.ComponentModel
    • ObservableProperty
    • INotifyPropertyChanged
  • CommunityToolkit.Mvvm.Input
    • RelayCommand

参考

この記事はすべて公開されています。この記事が「よかった」という方は、記事更新のためのサポートをお願いします。🚀

この続きはcodocで購入