プロプログラマ

プログラマーを職業としてます。 Flex,Air,C#,Oracle,HTML+JSの言語ノウハウを中心に情報発信していきます

Livetを使ってViewModelからMessageBox表示

ViewModelから直接MessageBox.Showを実行しても動きますが、ViewModelからコントロールを直接制御しないというのが理想なので、ViewModelからメッセージを送る形でMessageBoxを表示させます。
Livetを使用する場合は、比較的簡単に実装できます。
この実装が完全に正しいかどうかは正直よく分かっていませんが、まぁ動きます。

実装する量としては結局のところMessageBox.Showと変わりません。ただ面倒なだけです。
と考えるのは浅はかなのか。。。。

▼XAML

<i:Interaction.Triggers>
        <l:InteractionMessageTrigger Messenger="{Binding Messenger}" MessageKey="Information">
            <l:InformationDialogInteractionMessageAction/>
        </l:InteractionMessageTrigger>
        <l:InteractionMessageTrigger Messenger="{Binding Messenger}" MessageKey="Confirm">
            <l:ConfirmationDialogInteractionMessageAction />
        </l:InteractionMessageTrigger>
        <l:InteractionMessageTrigger Messenger="{Binding Messenger}" MessageKey="Error">
            <l:InformationDialogInteractionMessageAction/>
        </l:InteractionMessageTrigger>
</i:Interaction.Triggers>

▼ViewModel
ViewModelのベースクラスに実装しておくと便利

/// <summary>
/// 情報ダイアログを表示する
/// 使用するにはView側に、InteractionMessageTriggerの定義が必要
/// <param name="message"></param>
/// <param name="title"></param>
public void ShowInfoDialog(string message, string title = "情報")
{
    Messenger.Raise(new InformationMessage(message, title, MessageBoxImage.Information, "Information"));
}
 
/// <summary>
/// エラーダイアログを表示する
/// 使用するにはView側に、InteractionMessageTriggerの定義が必要
/// </summary>
/// <param name="message"></param>
/// <param name="title"></param>
public void ShowErrorDialog(string message, string title = "エラー")
{
    Messenger.Raise(new InformationMessage(message, title, MessageBoxImage.Error, "Error"));
}
 
/// <summary>
/// 確認ダイアログを表示する
/// 使用するにはView側に、InteractionMessageTriggerの定義が必要
/// <param name="message"></param>
/// <param name="title"></param>
/// <returns>OKが押された場合はtrue</returns>
public bool ShowConfirmDialog(string message, string title = "確認")
{
    var confirmationMessage = new ConfirmationMessage(message, title, MessageBoxImage.Question, MessageBoxButton.OKCancel, "Confirm");

    Messenger.Raise(confirmationMessage);
 
    return confirmationMessage.Response ?? false;
}


// 必要なタイミングで呼べばよい
ShowInfoDialog("処理完了");
ShowErrorDialog("エラー発生");
if (ShowConfirmDialog("処理を実行しますか?"))
{
	// OKが押されたときの処理
}

 

== ランキングに参加しています。ぜひクリックお願いします ==

プログラム ブログランキングへ
にほんブログ村 IT技術ブログへ
にほんブログ村

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください