web-dev-qa-db-ja.com

MVVMフレンドリーなダイアログ戦略の作成

アプリケーションのあらゆる部分で使用するポップアップフォームを処理するための戦略を作成しようとしています。これまでの私の理解では、MainWindowのルートに単一のUserControlが必要になるということです。これは、アプリ内で送信されるメッセージを処理する独自のViewModelにバインドされます。

私はMVVMLightを使用していますが、Messengerクラスはかなり新しいです。

オブジェクトのリストがListBox内に含まれているマスター/詳細シナリオを想像してみてください。これらの項目の1つを選択し、[編集]ボタンをクリックすると、画面全体をカバーするUserControlが表示されます。次に、ユーザーは選択したアイテムを編集し、[OK]をクリックして変更をコミットできます。

開いたUserControlを「汎用」にして、任意の(おそらくViewModel)をスローできるようにします... DataTemplateを介してViewModelをレンダリングします。すべてのオブジェクトの変更を処理します。 [OK]をクリックすると、送信クラスにコールバックされ、以前と同じように変更が保持されます。

これが役立ついくつかの状況は...

  1. ユーザー入力を必要としないエラーメッセージを表示します(閉じる場合はOK以外)
  2. データ項目の編集フォームを表示する
  3. 確認ダイアログ(標準のMessageBoxによく似ています)

誰かが私がこれを達成する方法のコードサンプルを提供できますか?

22
mortware

MVVMを使用してUIを設計する場合の目標は、Viewの懸念をViewModelの懸念から分離することです。理想的には、ViewModelはビューコンポーネントに依存しないようにする必要があります。ただし、これは理想的であり、MVVMのもう1つのルールは、必要に応じてアプリケーションを設計する必要があるということです。

ダイアログを表示するサービスを提供する領域では、2つの異なるアプローチが浮かんでいます。

  1. ビューへのDialogServiceの実装(例: http://geekswithblogs.net/lbugnion/archive/2011/04/13/deep-dive-mvvm-samples-mix11-deepdivemvvm.aspx サンプル03を参照) 。
  2. ビューにアタッチされていないサービスコンポーネントを実装する(例: http://blog.roboblob.com/2010/01/19/modal-dialogs-with-mvvm-and-silverlight-4/)を参照

どちらのアプローチも、サービスが提供する機能を定義するインターフェースに依存しています。次に、このサービスの実装がViewModelに注入されます。

また、どちらのアプローチにも特定の長所と短所がありますか。

  • 最初のアプローチはWP7でもうまく機能しますが、ビューサービスの実装が含まれているため、共通のビュー基本クラスが必要です。
  • 2番目のアプローチは、サービスをビューから分離し、ビューに制限を課さないため、SilverLight、WPF、およびアップルに適しています。

別の可能な解決策は、メッセージングを使用してダイアログを表示することです。

使用しているアプローチが何であれ、IoC(制御の反転)パターンを使用してViewとViewModelを分離したままにする、つまり、さまざまな実装を使用できるようにインターフェイスを定義するようにしてください。サービスをViewModelにバインドするには、インジェクションを使用します。つまり、サービスをViewModelのコンストラクターに渡すか、プロパティを設定します。

21
AxelEckenberger

最近、作成していたWPFアプリのMVVMの学習を開始しました。この 記事 をダイアログ表示の基礎として使用しました。サンプルプロジェクトをダウンロードすると、これは実際には非常に優れた分離メソッドであり、適切に抽象化されており、ビューを取得するには、ビューモデルのインスタンスを渡します。私はそれを自分の手段のためにいくらか拡張しました。標準のwin32MessageBoxはあいまいなので、警告やエラーなどにもWPFExtendedToolkitMessageBoxを使用しました。

動的フォームに関しては、ItemsControlを調査する必要があります。また、ViewModelには、ItemsControlをバインドするためにユーザーが編集する必要のあるデータアイテムのコレクションがあります。アクションのダイアログリストが完全に動的であるワークフローシステムデザイナに、アクションとそのパラメータを編集するためのダイアログがあります。これは、アイテムのコレクションをデータ型とともに公開することで行われたため、DataTemplateSelectorを使用して、正しいタイプのコントロールを含むDataTemplatesを選択できました。つまり、DateTimeのデータ型はDatePickerを示していました。

それが役立つことを願っています

7
Paulie Waulie

その一般的なコードを「維持」するためにやってくる開発者の観点からは、それは苦痛のように聞こえます。あなたが説明したことから、フォームとダイアログに同じビューモデルを与え、表示したいダイアログ用の特定のXAMLテンプレートを作成します。

2
Ritch Melton