1

ViewModel がダイアログ ボックスを開く方法について多くの質問があることは知っていますが、モデルはどのようにダイアログを起動しますか?

モデルはビューモデルのダイアログ サービスを呼び出すダイアログ サービスを呼び出す必要がありますか? モデルには mvvm-light ツールキットへの参照が必要ですか?

特に私の状​​況では、モデルオブジェクトを復元/解釈して構築するためにモデルにデータが渡される場合(これはモデルの仕事だと思います)、エラーが発生する可能性があります。


更新 #1: fmunkert からのコメントに基づいて、以下の回答を受け入れました。私は間違った質問をしていたことに気付きました.根本的な問題は、モデルがエラーを通知するためのパラダイムを設計することです.

4

2 に答える 2

2

MVVM は標準ではなく、MVVM で何が正しくて何が正しくないかを決定する決定的な権限がないため、任意の方法でダイアログ ボックスを適切に実装できます。 ViewModel またはモデル。

最近作成したアプリケーションでは、次の 2 つのアプローチを使用しました (独自の MVVM フレームワーク ライブラリを使用)。

  • モーダル ダイアログは、「サービス」を介して ViewModel から呼び出されます。つまり、ViewModel にはメソッドを使用してIFrontendポインターを取得するShowModalDialog()方法があります。には 2 つの一般的な実装がありますIFrontend。1 つは WPF 用 (ダイアログを開く) で、もう 1 つは単体テスト環境用 (ダイアログをシミュレートするだけ) です。

  • 非モーダル ダイアログは、ViewModel が認識しなくても開くことができます。たとえば、フォント選択ダイアログを開くことができるようにする必要があるフォームの ViewModel がある場合、これはユーザー インターフェイスの詳細であり、ViewModel はその詳細について知る必要があります。ViewModel は、フォントがダイアログを使用して選択されているか、ドロップダウン リストを使用して選択されているかを気にしません。

MVVM Light や Prism などのサードパーティ ライブラリを使用している場合は、ライブラリのドキュメントの推奨事項に従う必要があります。

于 2012-06-03T18:29:37.570 に答える
0

まだヘルプを探しているかどうかはわかりませんが、ダイアログに関して私がとったアプローチは、ビューモデルがイベントを発生させ、ビューが処理できるようにすることです。ビューは、ビューモデルにデータを取得するために必要なことを何でも実行できるようになったため、問題なくビューにダイアログを表示できます。ダイアログからの応答をイベントの EventArgs に渡して、続行するために探しているデータがビュー モデルに含まれるようにします。

例えば:

Public Class View

   Private WithEvents _VM AS new ViewModel()

   Private Sub _VM_AddingItem(Sender AS Object, E AS ViewModel.ItemEventArgs)
      Dim Dialog As new SomeDialog()

      If Dialog.ShowDialog then 
         E.Item = Dialog.Item
      Else
         E.Cancel = True
      End If
   End Sub 

End Class


Public Class ViewModel 
   Public Sub AddItem(Item AS Object) 
       Do Some Work here 
    End Sub 

    Private Sub _AddItem() 
       Dim Args AS New ItemEventArgs()

       OnAddingItem(Args)

       If not Args.Cancel Then AddItem(Args.Item)
    End Sub 

    Protected Sub OnAddingItem() 
       RaiseEvent AddingItem(me, ItemEventArgs)
    End Sub

    Public Event AddingItem(Sender AS Object, E As ItemEventArgs)

    Public Class ItemEventArgs
       Public Property Item AS Object
       Public Property Cancel AS Boolean = false
    End Class
End Class

_AddItem次に、メソッドに必要なデータを収集するイベントを発生させるプライベート メソッドにコマンドを接続しますAddItem。これが役立つことを願っています:)

于 2012-08-10T13:17:23.137 に答える