2016-05-06 14 views
0

この質問は、PRISM 5.0とMVVMパターンに基づくWPFアプリケーションを指します。MVVMデザイン:ViewModelでMessageBoxをブロックする

ユーザが意思決定を行うときに、望ましくないまたは否定的な結果が生じることがありますが、実際に進んで進めたいのかどうかをユーザに尋ねることは非常に一般的です。例えば

の一般的な方法の1つは、彼が本当にデータを削除したい場合は、削除後に復元することができないという、メッセージボックスをユーザーに依頼することです。

問題がある:私はViewModelに内部でメッセージボックスを呼び出す場合 、ViewModelには、外部からテスト不能になります。

//BAD! 
public class ViewModel 
{ 
    public Boolean Delete() 
    { 
     //Blocking and therefore untestable in automatic UnitTests 
     MsgBoxResult result = MsgBox.Show("Do you really want to delete?"); 

     if (result == yes) {//Do stuff that deletes data here;} 

    } 
} 

一つの可能​​性は、私の質問

//BETTER, BUT OK? 
public class ViewModel 
{ 
    private void OnDeleteAction 
    { 
     MsgBoxResult result = MsgBox.Show("Do you really want to delete?"); 
     if (result == yes) {Delete();} 
    } 

    public Boolean Delete() 
    { 
     //Testable from the outside again, because no blocking question 

     //Do stuff that deletes data here 
    } 

パブリックメソッドを呼び出し、別のprivateメソッドに質問をする、次のようになります。はですが、これは良い方法です以上がありますViewModelの中でユーザに尋ねるエレガントな方法?私にヒントやリンクを教えてもらえますか?PRISM 5.0には最高のものは何ですか?

ViewModelでUI要素を使用するのではなく、ブロックするMessageBoxなどの処理をブロックしてから処理を続けることはできません。

ありがとうございました!

+1

ビューモデル内の関連コードとビュー側のロジック関連コードを表示します。したがって、ビュー・コードの背後にあるメッセージ・ボックスを開き、ビュー・モデル・クラスでdeleteメソッドを呼び出したユーザーの選択に基づいて、メッセージ・ボックスを開くことができます。 –

+0

'public interface MuhMessageBox {bool AreYouCrazy(文字列メッセージ); } ' – Will

答えて

1

プリズムインタラクティブ機能は、ここに行く方法です。これにより、確認、通知を行い、MVVMパターンでうまく動作するカスタムダイアログを作成することができます。私は彼らを私のプリズムのアプリケーションでうまく使う。ここで

GitHubの上のプリズムレポでいくつかのコードへのリンクです:私の理解1のいずれかを書くべきではありませんあたりとして

Notification Request

Confirmation Request

Custom Content

Custom Request

+0

ありがとう、私はそれを読んで後で戻ってくる – Michael

+0

Sebastian SchulzとR.Richardsの両方の答えは素晴らしい助けでしたが、私はR.Richardsによって提供されたコード例が私を最も助けてくれたので、 。 WPF、MVVM、インタラクティブ機能については、手がかりがない場合はどこから始めるのか、例を参照してください。どうもありがとうございます。 – Michael

+0

リンクは廃止されました。更新されたものはありますか? – Flynn1179

3

私が知っているViewModelとViewModelの間の結合を減らすことができる2つの選択肢があります:対話サービスの使用と対話要求の実行です。どちらも非常によく説明されていますhere;あなたは一見をしたいかもしれません。

一般的な考え方は、非同期のやりとりがどのように行われ、イベントベースのロジックに近いものであるかを抽象化すると同時に、ViewModelが操作の一部としてユーザーとやり取りすることを表現できるようにすることです;最終的な結果は、この相互作用を文書化し、ユニットがそれをテストできることです。

+0

ありがとう、私はそれを読んで後で戻ってくる – Michael

+0

ありがとう、セバスチャン。あなたのヒントは大きな助けとなりましたが、この場合、彼の偉大なコード例のために、R.Richardsの答えが最善の助けとなります。受け入れられた答えの下で私のコメントを参照してください。 – Michael

関連する問題