2009-08-26 50 views
9

MVVMスタイルで書き込もうとしているWPFアプリケーションがあります。ドキュメントが開かれたときのように例外がスローされた場合、MessageBoxを表示したいと思います。簡単ですが、MessageBox.Show呼び出しがModelViewにあるので、私のコードはきちんと感じられません。ビューには何かがあると思っていましたが、ビューにコードを入れることは想定されていません。MVVM例外処理

質問は実際にはに蒸留することができますが、MVVMにMessageBoxを表示するにはどうすればいいですか?

答えて

16

は、サービスを使用します。

public void SomeMethodInYourViewModel() 
{ 
    try 
    { 
     DoSomethingDangerous(); 
    } 
    catch (Exception ex) 
    { 
     ServiceLocator.Resolve<IMessageService>().ShowMessage(ex.Message); 
    } 
} 

あなたは今、メッセージのプレゼンテーションから、あなたのVMをデカップリングしています。標準(醜い)メッセージボックスを使用しないことを決定しても、VMには影響しません。

+1

+1:また、ServiceLocatorを使用する代わりに、Dependency Injectionを使用して、必要に応じてIMessageServiceをVMに挿入することもできます。 –

+0

プレゼンテーションレイヤーからデカップリングするため、ViewModelの単体テストを行うことができます。 – jbe

9

ジョシュ・スミスの優れたMVVM Foundation(Codeplex)をご覧ください。具体的には、互いに気づく必要のないさまざまなViewModelオブジェクト間でメッセージを渡す軽量な方法であるMessengerクラスを見てください。

また、「ビュー内にコードはありません」という固いルールはありませんが、可能な場合は避けるのが最善です...あなたのXAMLは単純に.netコードで書かれています宣言的な構文で;コードビハインドはそれを補うための単なるC#またはVB.netです(絶対に必要な場合)

+0

"no code in view"ルールについて無視してください。それはとにかくガイドラインの多くです。 :) –

2

ViewがバインドできるViewModelクラスにErrorMessage文字列プロパティを設定することもできます。