RelayCommand と RelayCommand<T>

RelayCommandRelayCommand<T> は、メソッドまたはデリゲートをビューに公開できる ICommand の実装です。 これらの型は、ビューモデル要素と UI 要素の間でコマンドをバインドする方法として機能します。

プラットフォーム API:RelayCommandRelayCommand<T>IRelayCommandIRelayCommand<T>

そのしくみ

RelayCommandRelayCommand<T> の主な機能は以下のとおりです。

  • これらは ICommand インターフェイスのベースとなる実装を提供します。
  • また、CanExecuteChanged イベントを発生させる NotifyCanExecuteChanged メソッドを公開する IRelayCommand (および IRelayCommand<T>) インターフェイスも実装します。
  • これらは、ActionFunc<T> のようなデリゲートを受け取るコンストラクターを公開し、これにより、標準メソッドとラムダ式のラップが可能になります。

ICommand の操作

単純なコマンドを設定する方法を以下に示します。

public class MyViewModel : ObservableObject
{
    public MyViewModel()
    {
        IncrementCounterCommand = new RelayCommand(IncrementCounter);
    }

    private int counter;

    public int Counter
    {
        get => counter;
        private set => SetProperty(ref counter, value);
    }

    public ICommand IncrementCounterCommand { get; }

    private void IncrementCounter() => Counter++;
}

この場合、相対 UI は次のようになります (WinUI XAML を使用)。

<Page
    x:Class="MyApp.Views.MyPage"
    xmlns:viewModels="using:MyApp.ViewModels">
    <Page.DataContext>
        <viewModels:MyViewModel x:Name="ViewModel"/>
    </Page.DataContext>

    <StackPanel Spacing="8">
        <TextBlock Text="{x:Bind ViewModel.Counter, Mode=OneWay}"/>
        <Button
            Content="Click me!"
            Command="{x:Bind ViewModel.IncrementCounterCommand}"/>
    </StackPanel>
</Page>

Button はビューモデル内の ICommand にバインドされ、これはプライベートの IncrementCounter メソッドをラップします。 TextBlockCounter プロパティの値を表示し、プロパティ値が変更されるたびに更新されます。

  • MVVM Toolkit の実際の動作を確認するには、サンプル アプリ (複数の UI フレームワーク向け) を参照してください。
  • 単体テスト」では、さらに他の例を確認できます。