これをどのように処理するかは、状況によって異なります。単一の最良のルールはありません(IMHO)
一般的なエラー表示パターンについては、http://slodge.blogspot.co.uk/2012/05/one-pattern-for-error-handling-in.htmlに1つの提案があります。
アプリケーションレベルの通知を表示するために同様のパターンを使用しました。たとえば、長時間実行されている操作が完了したとき、チャットメッセージが到着したとき、または...
メッセージボックスの表示方法に関する興味深い投稿の1つは、次のとおりです。http: //awkwardcoder.blogspot.co.uk/2012/03/showing-message-box-from-viewmodel-in.html-完全に理解できるかどうかはわかりません最終的な解決策に従いますが、すべきでないことについては確かにいくつかの良い点があります。
更新されたシナリオでは、メッセンジャー(TinyMessengerなど)を使用するか、ViewModelによって公開されてViewによって消費される通常のC#イベントを使用することを検討します。
ページ上でボタンをクリックすると、ViewModelでメソッドが実行されます
Click / Tap/TouchDownボタンにバインドされたICommandを使用してこれを実装します
これは、2つのメッセージのどちらを顧客に表示するかを決定するための評価を行います。
私は間違いなくサービス内にロジックを実装します
これはViewModelから呼び出され、結果/決定により、プロパティまたはプライベートフィールドの状態が変化する可能性があります。
次に、ビューはどのようにしてメッセージを表示するかを決定しますか?私は3つのオプションを考えることができます:
- ビューはプロパティの変更(通常のMvvm INPC)に応答するだけで済みます-これが私の好みです
- ViewModelは、それがトリガーする通常のC#イベントを公開する可能性があります...
- ViewModelはメッセージを送信できます
この最後のオプション(メッセージング)は、おそらくここで最も柔軟なソリューションです。後で責任を変更することにした場合に備えて、ViewとViewModelを分離します。メッセージングを実装するには、次のいずれかを行います。
メッセージはアラートまたはポップアップとして表示されます(ネイティブ、またはできれば完全に私がスタイルを設定します)。
これはViewの懸念事項であるため、Viewプロジェクトによって完全に制御されます。UIAlert、Toast、ToastPromptなどのコントロールを使用します-これらはすべてスタイルを設定できます
メッセージはその後フェードします([OK]ボタンのクリック、できれば3秒)。メッセージが却下された後...
ビューでは、何らかの形式のコードビハインド(またはWP7の動作)を使用します。これにより、クリック/フェード/非表示が検出され、ViewModelでICommand(私の設定)またはパブリックメソッドのいずれかが呼び出されます。
新しいページもナビゲートされます
このナビゲーションはViewModelから要求されます
(2つのメッセージのどちらが表示されたかによって異なります)。
これは、上記のフローを追跡するのは簡単です...おそらくViewModelは何を表示するかをすでに知っています。
それが私がすることです...
- ViewModels(およびそれ以下)内にアプリケーションフローロジックを保持します
- ビュー内にプレゼンテーションを保持します
...しかし、他のオプションがあると確信しています:)
最後の注意点...フェードアウトしてからナビゲートするロジックは、WP7とAndroidでの切り替え/トゥームストーニングによって実際に「混乱」する可能性があります。これは特定のシナリオでは重要な場合とそうでない場合があります。