Viewで発生した各種イベントをViewModelで処理する方法について。
初めに
調べるきっかけになったのは、ウィンドウの閉じるボタンを押したときの動作。閉じた時、アプリケーションが何らかの動作をしていたら、ダイアログを出すなどの追加処理をしたかったため。
View側でやった場合、Modelの状況が分からないので、ViewModelで対処をしたかった。
一応、Prismを使うことで可能になったのだが、ViewModel側でSystem.ComponentModelのイベント処理を行うことへの抵抗感が肝かな。
実装方法
ViewModel側でのコマンド
// 定義
public DelegateCommand<CancelEventArgs> closeAction { get; private set; }
// 生成
closeAction = new DelegateCommand<CancelEventArgs>(x => closeEvent(x));
// イベント処理
private void closeEvent(CancelEventArgs e) {
実際の閉じるときの処理
}
xaml側の記述
名前の定義
xmlns:prism="http://prismlibrary.com/"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
イベントへの割り付け
<i:EventTrigger EventName="Closing">
<prism:InvokeCommandAction Command="{Binding closeAction}"/>
</i:EventTrigger>
コマンドのバインドはprism側のInvokeCommandActionを使用する。
最後に
これを使うことで、ほかにも、Drag&Dropなどのイベントにも、ViewModel側で対応できるので、利用の範囲が広がっていく。
コメント