4

IDialogServiceアプローチのフォローアップ:

System.Windows.MessageBoxResult列挙型はどうですか?それをインターフェースから遠ざけ、実装にのみ関与させるためのより良いアプローチはありますか?

System.Windows.MessageBoxResult私が列挙型に選んだアプローチ

はい、いいえ、わかりました、キャンセルをカバーする列挙型をIDialogInterfaceの横に追加しました:

namespace Foo.Bar.Dialogs
{
    public enum DialogResult { Ok, Yes, No, Cancel }

    public interface IDialogService
    {
        void ShowErrorBox(string error_message);

        DialogResult ShowQuestionBox(string question_message);

        DialogResult ShowQuestionBox(string question_message, string caption);

        DialogResult ShowQuestionBox(string question_message, string caption, bool allow_cancel);

        DialogResult ShowQuestionBox(string question_message, string caption, bool allow_cancel, bool show_as_error);

        void ShowWarningBox(string message, string caption = "");

        void ShowInformationBox(string message);

        void ShowInformationBox(string message, string caption);
    }
}

最初の質問:

すべてのコマンドを.asmx.csファイルから一部のアプリケーションのメインウィンドウのViewModelに移動する作業を行っています。

ここで、ユーザーに確認を求めるコマンドをどうするかを理解する必要があります。

のところ、ViewModelで必要なタイプを吸い込んで、ダイアログボックスを直接起動します。私はこれがこれを行うための最良または最もクリーンな方法ではないと確信しています。

私はこの記事を面白くてよりクリーンなアプローチで見つけました。IDialogServiceインターフェイスを使用します。

public interface IDialogService
{
    int Width { get; set; }
    int Height { get; set; }
    void Show(string title, string message, Action<DialogResult> onClosedCallback);
}

また、IDialogInterfaceを使用する前に、IDialogInterfaceがnullであるかどうかをチェックするため、この記事の方が優れているようです。

private void PerformAddNewCustomer() 
{ 
    CustomerList.Add(new Customer { Name = "Name" + i }); 
    i++; 

    if (dialogService != null) 
    { 
        dialogService.Show("Customed added"); 
    } 
} 

これは、ダイアログをViewModelから分離するための最良の方法ですか、それともさらに優れたアプローチがありますか?

4

2 に答える 2

1

あなたが投稿したリンクのアプローチは優れたものであり、非常に広まっていると思います(ソース:私はウェブ上のコードを見ています;))。使い方はかなり簡単で、単体テストでダミー サービスを使用してダイアログをテスト可能にし、ダイアログのリファクタリング プロセスを簡素化します。

個人的には、私のDialogServiceメソッド シグネチャはリストを取り、Tuple<string, Action>それに基づいてダイアログ ウィンドウのボタンを作成します。これにより、サービスに新しいメソッドを追加することなく、ダイアログ ウィンドウからいくつかの特別な機能を要求することができます。メッセージ ボックス以上ViewModelのものが必要になるたびに(使いやすいように独自のメソッドとして持っていますが)。OkYesNo

したがって、これは堅実なアプローチであり、現時点では、完全に優れたものを見つけることはできず、個人的に好きなものだけを見つけることができると思います.

于 2012-04-06T10:28:12.923 に答える
0

あなたが見つけた記事は、MVVM でダイアログ ウィンドウを処理するための優れたアプローチであり、実際に再利用可能であり、DI を使用すると、ビューで簡単に使用できます。

ほとんどの場合、MVVMライトツールキットを使用し、メッセンジャーがあり、メッセンジャーを使用して別のクラスにメッセージを送信すると、表示したいダイアログが開き、結果はメッセージが返されたので、ユーザーの選択に応じることができました。

于 2012-04-06T10:20:33.310 に答える