ViewModelから使用者にメッセージを出したい時ってのは結構あります。
普通にMessageBox.Showの記述をすればメッセージは表示されますし、何か支障があるか?と言われれば何もありません。
ViewModelでViewを操作するなんて云々と巷では言われており、確かに問題点を調べると納得できますが一人でViewもViewModelも平行して作るなら全然関係ないです。
と言うか、MessageBox.Showの方が簡潔に書ける分工数は減ります。
そうは言ってもMVVMに則った手法を覚えておいても損はないと思うので検索してみたところLivetCask.Messagingが一番分かりやすかった(それを書いている人の説明が上手い)ので、それをベースに作ってみます。
まずやる事はNuGetで「LivetCask.Messaging」をインストールします。
その後MainWindow.xamlで
xmlns:l="http://schemas.livet-mvvm.net/2011/wpf"
を追加します。
さらに同ファイルで
<i:Interaction.Triggers>
<!-- Confirmationに対応 -->
<l:InteractionMessageTrigger Messenger="{Binding Messenger}" MessageKey="Confirmation" >
<l:ConfirmationDialogInteractionMessageAction/>
</l:InteractionMessageTrigger>
<!-- Informationに対応 -->
<l:InteractionMessageTrigger Messenger="{Binding Messenger}" MessageKey="Information" >
<l:InformationDialogInteractionMessageAction/>
</l:InteractionMessageTrigger>
<!-- OpenFileに対応 -->
<l:InteractionMessageTrigger Messenger="{Binding Messenger}" MessageKey="OpenFile" >
<l:OpenFileDialogInteractionMessageAction/>
</l:InteractionMessageTrigger>
<!-- SaveFileに対応 -->
<l:InteractionMessageTrigger Messenger="{Binding Messenger}" MessageKey="SaveFile" >
<l:SaveFileDialogInteractionMessageAction/>
</l:InteractionMessageTrigger>
</i:Interaction.Triggers>
とりあえず全部書いてみましたが必要なダイアログだけ記述すればOKです。
Confirmation:YesNoやOKCancelなどの結果が返ってくるメッセージボックス
Information:単にメッセージを表示してOKボタンで閉じるメッセージョボックス
OpenFile:ファイルを開く時に使うダイアログ
SaveFile:ファイルを保存する時に使うダイアログ
となります。
ウィンドウの最小化や最大化をしたり、別ダイアログを開いたりする機能もありますが、今回はメッセージボックス(+α)に絞っています。
ViewModelではInteractionMessengerのインスタンスを作り、ConfirmationMessageやInformationMessageを必要に応じて生成した後にInteractionMessengerのメソッドを使ってViewに渡すといったイメージです。
例としてInformationメッセージを非同期で実行するメソッドを紹介します。
private async void ShowInformationDialog(string message, string title, MessageBoxImage image)
{
await Messenger.RaiseAsync(new InformationMessage(message, title, image, "Information"));
}
最後の引数「Information」はMainWindow.xamlのMessageKey=に記述されている名称と一致します。
詳細を知りたい方はサンプルソースを見てください。
単独でプログラムを作っている時に使うか?と問われたら「たぶん使わない」と答えますw
0 件のコメント:
コメントを投稿