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"を右辺に記述することにした。これがベストな方法ではないのかもしれない。