2011-07-06 3 views
23

私は、アプリケーションのどの部分でも使用できるポップアップフォームを扱うための戦略を作成しようとしています。これまでのところ私の理解では、私のMainWindowのルートに単一のUserControlが必要です。これは、アプリケーション内で送信されるメッセージを処理する独自のViewModelにバインドされます。MVVMに優しいダイアログストラテジーを作成する

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

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

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

これは有用であろういくつかの状況では、(それを閉じるには、[OK]を除く)なし必要なユーザー入力

    1. 表示エラーメッセージがデータ項目
    2. ための編集フォームを表示...です
    3. 確認ダイアログ(標準のMessageBoxとよく似ています)

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

  • 答えて

    22

    MVVMを使用してUIを設計するときは、ViewModelの懸案事項とViewの懸案事項を分けることが目的です。理想的には、ViewModelはどのビューコンポーネントにも依存してはいけません。しかし、これは偶然であり、MVVMのもう1つのルールは、必要に応じてアプリケーションを設計する必要があるということです。ビューをDialogService実装

    1. (例えばhttp://geekswithblogs.net/lbugnion/archive/2011/04/13/deep-dive-mvvm-samples-mix11-deepdivemvvm.aspxサンプル03を参照):領域で

      はarroundのフローティング2つの異なるアプローチが存在するダイアログを示すサービスを提供します。

    2. 両方のアプローチは、サービスが提供する機能を定義するインターフェイスに依存し

    (例えばhttp://blog.roboblob.com/2010/01/19/modal-dialogs-with-mvvm-and-silverlight-4/参照)ビューに接続されていないないサービス・コンポーネントを実装します。このサービスの実装は、ViewModelに注入されます。

    また、両方のアプローチにはそれぞれ固有の利点と欠点があります。

    • しかし、最初のアプローチはWP7でもうまくいきますが、ビュー・サービスの実装が含まれているため、共通のビュー・ベース・クラスが必要です。
    • 2番目の方法は、SilverLightとWPFおよびappleallの場合は、サービスをビューから切り離して保持し、ビューには何も残らないため、うまく機能します。

    メッセージングを使用してダイアログを表示することもできます。

    あなたが使用しているアプローチは、IoC(コントロールの反転)パターンを使用してViewとViewModelを分離した状態に保ちます。つまり、異なる実装を使用できるようにインターフェイスを定義します。サービスをViewModelにバインドするには、注入を使用します。つまり、サービスをViewModelのコンストラクタに渡すか、プロパティを設定します。

    8

    私は最近作成したWPFアプリケーションのMVVMを学び始めましたが、これはarticleを使ってダイアログを表示しました。サンプルプロジェクトをダウンロードすると、かなりデカップリングされた方法です。 viewmodelのインスタンスを渡すビューを取得します。私はそれをやや拡張して、標準のwin32 MessageBoxが醜いので、警告、エラーなどのためにWPFExtendedToolkit MessageBoxも使用しました。

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

    汎用コードは、それが痛みのように聞こえることを「維持」に入ってくる開発者の視点から

    3

    に役立ちます願っています。あなたが記述したことから、フォームとダイアログに同じビューモデルを与え、表示したいダイアログ用の特定のXAMLテンプレートを作成します。

    関連する問題