Prism使ったWPFでLivetCask.Messagingを使ってみる

2020/02/25

C# Prism

アイキャッチ

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

自己紹介

自分の写真



新潟県のとある企業で働いてます。
【できる事】
電子回路設計
基板パターン設計
マイコンプログラム
C#(WinForms WPF)を使ったWindowsアプリケーション作成
PLCラダー
自動化装置アドバイザー
にほんブログ村 IT技術ブログ ソフトウェアへ

カテゴリ

このブログを検索

QooQ