WPF の コマンド 概要

0 件のコメント

WPF で利用される Command(コマンド) に関して簡単なまとめを記載します。 コマンドは操作を分離したもので、関連するオブジェクトに コマンド ソース、コマンド および コマンド と 実装 を結びつける コマンド バインディング があります。 (他にもありますが…ここでは割愛します。。) 以下ではこれらを簡単に紹介します。

目次

コマンド ソース

コマンド を実行できる(ICommand.Execute を実行できる)画面上の要素(GUI上のオブジェクト)を表します。 コマンド ソース は ICommandSource インターフェイス を実装し、xaml 上で コマンドの実態 と 引数 を設定できます。 定義済みの コマンド ソース は4種類あり、基本的には クリック で指定された コマンド が実行されます。 以下のリストでは継承先もあわせて記載しています(すべて調べきれているか分かりませんが…)。

ICommandSource

プロパティ

  • ICommand Command { get; }
  • Object CommandParameter { get; }
  • IInputElement CommandTarget { get; }

定義済み コマンド ソース

  • ButtonBase
    • Button
      • CalendarButton
      • CalendarDayButton
    • ToggleButton
      • CheckBox
      • RadioButton
  • MenuItem
  • Hyperlink
  • InputBinding

コマンド

実行される コマンド を表現します。 コマンドは意味を定義するもので実装は定義しません。 定義済みコマンドも中身の実装がありません。 コマンド と その実装 はこの後に記載する コマンド バインディング で関連付けます。

ICommand

イベント

  • event CanExecuteChanged

メソッド

  • bool CanExecute(object parameter)
  • void Execute(object parameter)

定義済 コマンド

  • ApplicationCommands
  • NavigationCommands
  • MediaCommands
  • EditingCommands
  • ComponentCommands

コマンド バインディング

コマンドとその実装を接続します。 以下では ApplicationCommands.Close を MainView.CommandBinding_Executed と関連付ける xaml と実装のサンプルを記載します。

MainView.xaml

<Window x:Class="sample.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Sample WPF Application">
  <Window.CommandBindings>
    <CommandBinding Command="ApplicationCommands.Close"
                    Executed="CommandBinding_Executed"
                    CanExecute="CommandBinding_CanExecute" />
  </Window.CommandBindings>
  <StackPanel>
    <Button Command="ApplicationCommands.Close" 
            Content="Close" />
  </StackPanel>
</Window>

MainView.xaml.cs

namespace sample
{
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Input;

    public partial class MainView : Window
    {
        public MainView()
        {
            this.InitializeComponent();
        }

        private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            this.Close();
        }

        private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = true;
        }
    }
}

参考記事