CommunityToolkit.Mvvm パッケージ (別名 MVVM Toolkit、以前は Microsoft.Toolkit.Mvvm) は、最新の高速なモジュール式 MVVM ライブラリです。これは .NET コミュニティ ツールキットの一部であり、次の原則に基づいて構築されています。
- プラットフォームとランタイムに依存しない - .NET Standard 2.0、.NET Standard 2.1、および .NET 6 (UI フレームワークに依存しない)
- 簡単に手に取って使用できます。アプリケーションの構造やコーディング パラダイム (「MVVM」以外) に対する厳密な要件がないため、柔軟に使用できます。
- オプション - 使用するコンポーネントを自由に選択できます。
- 参照実装 - 無駄がなくパフォーマンスが高く、基本クラス ライブラリに含まれるインターフェイスの実装を提供しますが、それらを直接使用する具体的な型がありません。
観測可能なオブジェクト / ObservableObject
WPF では、MVVM デザイン パターンのプログラムを書くには当然フォアグラウンド データとバックグラウンド データのバインドが必要ですが、ネイティブ実装ではバインド可能なクラスを作成し、そのクラスのバインド可能なメンバーを記述することが非常に重要です。値が変更されたときに「PropertyChanged」イベントを手動でトリガーする必要があります。一般的なコードは次のようになります。
public class MainViewModel : INotifyPropertyChanged
{
private string windowTitle = "Toturial App";
public string WindowTitle
{
get => windowTitle;
set
{
windowTitle = value;
NotifyPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged([CallerMemberName] string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
このように、各プロパティに対応するフィールドを記述し、手動でゲッター、セッターを記述し、セッターでプロパティの変更を通知する必要があるのは明らかで、非常に面倒です。
CommunityToolkit.Mvvm では、このような繰り返しコードを生成するためのソース ジェネレーターが提供されており、必要な箇所に機能を追加するだけで、これらの複雑な処理を実現できます。たとえば、上記のコードは CommunityToolkit.Mvvm にあり、コードは次のようになります。
[ObservableObject]
public partial class MainViewModel
{
[ObservableProperty]
private string windowTitle = "Toturial App";
}
ObservableObject 属性を必要な ViewModel に追加し、配布クラスを使用します。これにより、この型の INotifyPropertyChanged の実装が自動的に生成されます。ObservableProperty 機能でマークされたフィールドの場合、ソース ジェネレーターはフィールド名がキャメルケースに変換された後にプロパティを自動的に生成し、プロパティ変更の通知ロジックをプロパティ定義に組み込みます。
つまり、それほど複雑なロジックを書く必要はありません。監視可能な型には ObservableObject をマークし、監視可能なプロパティには ObservableProperty をマークするだけで、残りは自動的に生成されます。
RelayCommand / リレーコマンド
ネイティブWPFでも同様にコマンドを定義するのが非常に面倒です。コマンド専用のクラスを作成し、ICommand インターフェイスを実装する必要があります。このインターフェースには、命令の実行可否の判定、命令の実行、「命令実行可能変更」を通知するイベントが含まれる。
public class MyCommand : ICommand
{
public bool CanExecute(object parameter)
{
// 这里写判断命令是否可执行的逻辑
}
public void Execute(object parameter)
{
// 这里是命令执行的逻辑
}
// 这里是用于通知指令可执行性变更的事件
public event EventHandler? CanExecuteChanged;
}
しかし、多くの場合、私たちの命令は単純なロジックにすぎず、単純なロジックのクラスを作成するのは少し面倒です。そこで、CommunityToolkit.Mvvm は RelayCommand という機能を提供します。
RelayCommand でメソッドをマークすると、CommunityToolkit.Mvvm はメソッドが配置されているクラスの下に対応するコマンドを生成します。また、手動でコマンド クラスを自分で作成しなくても、インターフェイス上でこのコマンドに直接バインドできます。
public partial class MainWindow
{
public MainWindow()
{
// 将绑定上下文设为自身
DataContext = this;
InitalizeComponents();
}
// 这里会生成一个 ShowMessageCommand 属性
[RelayCommand]
public void ShowMessage()
{
MessageBox.Show("Hello world!");
}
}
<Window ...>
<Grid>
<StackPanel>
<!--直接绑定到后台的 ShowMessageCommand-->
<Button Content="Click Me" Command="{Binding ShowMessageCommand}"/>
</StackPanel>
</Grid>
</Window>