MessageBoxの表示結果でコマンドを実行する処理をBlend 4から実装する

昨日はExpression Blend 4でMessageBoxを表示するコマンドを、組込みのビヘイビアである EventTriggerとそのアクションであるInvokeCommandActionを使って実装した。

では、以下のようなよくある処理は同様の方法で可能だろうか。

1. MessageBoxを表示する
2. OKボタンがタップされたならばPage2に遷移する
3. キャンセルボタンがタップされたならばそのままPage1に留まる

Blend 4のビヘイビア-アクションには「条件」を設定できるものがあり、コマンドを起動できる。前回紹介したInvokeCommandActionもその一つである。

コマンドの追加

前回はメッセージボックス表示のコマンドだけだったが、今回はメッセージボックス表示の結果によっては、次のページに遷移しなくてはならないため、そのためのコマンド"NavigateCommand"クラスを用意した。

  • NavigateCommand.cs
    public class NavigateCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;
        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            var n = new Navigator();
            n.NavigateTo(@"/Page2.xaml");
        }
    }

Navigatorは新たに起こしたクラスで、以前に書いたようにView依存せずにページ遷移を行うためのクラスである。

  • Navigator.cs
    public class Navigator
    {
        public void NavigateTo(string pageName)
        {
            Uri pageUri = new Uri("/" + pageName, UriKind.Relative);
            var frame = (PhoneApplicationFrame)Application.Current.RootVisual;
            frame.Navigate(pageUri);
        }
    }

あとはMessageBoxの時と同様にNavigateCommandをXAML上のリソースに宣言すれば良い。

前回同様にKey属性で指定したcmdNavigateで参照することができる。

条件の設定(Page1.xaml)

Blend 4で配置済みのInvokeActionCommandのプロパティを見ると「条件」があり、これで条件付きのビヘイビアを追加/削除することができる。
この条件を記述することで、このアクションの前提条件を表現することができる。


条件は左辺(LeftOperand)の値と右辺(RightOperand)の値、そしてそれらの比較オペレータで記述する。今回の場合、OKボタンが押下された := MessageBoxResult == MessageBoxResult.OK (1)の条件でこのコマンドが実行されるように記述すれば良い訳だ。

なお、今まではXAMLを直接修正する必要は無く、全てBlend 4のデザイナ上で選択、入力することが出来たが、今回の記述(LeftOperand="{Binding Source={StaticResource cmdConfirm}, Path=Result}")だけはXAMLを直接記述する必要があった。

このXAMLを見ればすぐに意味が分るが、ポイントはConditionBehaviorとその条件として記述するConditionExpressionと実際の条件であるComparisonConditionである。この例では左辺(LeftOperand属性)にはリソース"cmdConfirm"で参照できるMessageBoxCommandクラスのResultプロパティをバインドし、右辺(RightOperand属性)でその値が"1"つまりMessageBoxResult.OKであることを条件としている。※

※MessageBoxResult.OKという定数を宣言、参照することができず、ここは直定数の"1"を右辺に記述することにした。これがベストな方法ではないのかもしれない。

実行結果


以上の実装によりMessageBoxの表示後の結果(MessageBoxCommand#Result)によりPage2に遷移するか、Page1に留まるかを分岐することができるようになった。今回もコードビハインドには一行のコードも書いていない。