9

Pluralsight で MVVM に関するビデオを見ているときに、MVVM パターンに違反している状況がありましたが、それを行う正しい方法は示されていませんでした。

  • ビューには、ViewModel で ICommand を使用してハンドラーをトリガーするボタンがありました。
  • ハンドラーは実行をリポジトリ実装に正しく中継しました。
  • Web サービス メソッドと呼ばれるリポジトリの具体的な実装。

ただし、Web サービスの呼び出しが失敗した場合、ViewModel はユーザーにエラーを通知するメッセージ ボックスを表示します。ViewModel は View の抽象化であるため、UI を直接作成するべきではありませんが、メッセージ ボックスをユーザーに提示する 100% クリーンな方法は何ですか?

4

2 に答える 2

12

サービスを作成します。

interface IDialogService
{
    void ShowMessageBox(string message);
}

実装します:

class DialogService : IDialogService
{
    public void ShowMessageBox(string message)
    {
        MessageBox.Show(); // ...
    }
}

依存性注入を使用します。

class ViewModel
{
    [Import] // This is MEF-specific sample
    private readonly IDialogService dialogService;
}

またはサービスの場所:

class ViewModel
{
    private AnyCommandExecute()
    {   
        // This is MEF-specific sample
        var dialogService = container.GetExportedValue<IDialogService>();
    }
}

ビュー モデルで具象を取得するIDialogServiceには、取得した実装を ViewModel から呼び出します。

同じアプローチは、他の同様のケースにも適用できます。開く/保存ダイアログを表示し、カスタム ビュー モデルをダイアログに表示します。

于 2013-06-01T22:06:09.447 に答える
5

Interaction ServiceInteraction Requestなど、MVVM パターンに準拠した方法がいくつかあります。

インタラクション サービス

... ビューモデルがユーザーとの対話を開始するために使用できるサービスであり、それによってビューの実装に対する独立性を維持します

ここに画像の説明を入力

インタラクションリクエスト

... ビューモデルによって発生したイベントを使用して、ユーザーと対話する意図を表現し、これらのイベントにバインドされ、対話の視覚的側面を管理するビュー内のコンポーネントと共に使用します。

ここに画像の説明を入力

ソース

上記の両方の引用は、次のソースからのものです (パターンに関するより詳細な情報も含まれています): http://msdn.microsoft.com/en-us/library/gg405494(v=pandp.40).aspx#sec10

于 2013-06-01T22:08:47.093 に答える