前回:http://blogs.wankuma.com/kazuki/archive/2008/03/24/129252.aspx
今までコマンドを無条件に実行するようにしてた例ばかりだったけど、そういう時ばかりじゃないのが世の中ってもんだ。
ということで、前回の例を少しだけ拡張して、CheckBoxにチェックがあるときだけ「閉じる」コマンドが実行されるようにしてみようと思う。
さて、コマンドの初回くらいでICommandのメンバあたりについて説明したようなしてないような気がする。その時にCanExecuteというものの存在についても紹介してたような気がする。
つまり、CanExecuteがfalseならコマンドを実行しないという手はずになってる。
RoutedCommandではどうなっているのかというと、CommandBindingの時点でCanExecuteイベントを紐付けることになってる。
このイベントの引数のCanExecuteRoutedEventArgsのCanExecuteプロパティにtrue/falseを設定することで、コマンドの実行/実行しないの制御ができます。
ということで、XAML側にCheckBoxを1つ追加して、CanExecuteイベントをComandBindingに追加した。
- <Window x:Class="WpfDefCommand.Window1"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Title="こまんど その8" Height="250" Width="250">
- <Window.CommandBindings>
-
-
- <CommandBinding Command="Close" Executed="Close_Executed" CanExecute="Close_CanExecute" />
- </Window.CommandBindings>
- <DockPanel>
- <Menu DockPanel.Dock="Top">
- <MenuItem Header="ファイル(_F)">
-
- <MenuItem Command="Close" />
- </MenuItem>
- </Menu>
-
- <CheckBox Name="canClose" Content="閉じる" />
- </DockPanel>
- </Window>
<Window x:Class="WpfDefCommand.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="こまんど その8" Height="250" Width="250">
<Window.CommandBindings>
<!-- Closeコマンドが発行されたらClose_Executedを呼びます -->
<!-- 実行可能かどうかは、Close_CanExecuteで判断します -->
<CommandBinding Command="Close" Executed="Close_Executed" CanExecute="Close_CanExecute" />
</Window.CommandBindings>
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="ファイル(_F)">
<!-- このメニューを押すとCloseコマンドを発行します -->
<MenuItem Command="Close" />
</MenuItem>
</Menu>
<!-- 閉じていいかどうかを指定するためのチェックボックス -->
<CheckBox Name="canClose" Content="閉じる" />
</DockPanel>
</Window>
C#側のコードは、すごく単純です。純粋にCheckBoxにチェックがあるかないかを見てCanExecuteプロパティにtrue/falseを入れてます。(??演算子が目新しい?)
- using System.Windows;
- using System.Windows.Input;
-
- namespace WpfDefCommand
- {
- public partial class Window1 : Window
- {
-
- public Window1()
- {
- InitializeComponent();
- }
-
- private void Close_Executed(object sender, ExecutedRoutedEventArgs e)
- {
-
- this.Close();
- }
-
- private void Close_CanExecute(object sender, CanExecuteRoutedEventArgs e)
- {
-
- e.CanExecute = canClose.IsChecked ?? false;
- }
- }
- }
using System.Windows;
using System.Windows.Input;
namespace WpfDefCommand
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void Close_Executed(object sender, ExecutedRoutedEventArgs e)
{
// 自分自身を閉じます
this.Close();
}
private void Close_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
// チェックがついてたら実行可能にします
e.CanExecute = canClose.IsChecked ?? false;
}
}
}
ここまで出来たら後は実行!
チェックが入ってないときは閉じるメニューはグレーになってる。
チェックを入れてるときは、閉じるメニューがクリックできる。