2

私はWPF MVVMモデルにかなり慣れていないので、ご容赦ください。在庫管理システムを作成しようとしています。ビューモデルに正常にリンクするメンテナンス ページがあります。ただし、メンテナンス ページからトリガーできる検索コントロールを有効にして、ユーザーが項目を検索して選択し、選択した項目が表示された状態でメンテナンス画面に戻ることができるグリッドをポップアップ表示したいと考えています。

このタイプの機能を MVVM に実装するにはどうすればよいでしょうか? メンテナンス画面の検索ボタンは検索 ICommand にリンクできますが、Viewmodel は UI を認識していないため、検索コントロールの名前や表示方法がわかりません。私が考えることができる唯一の考えは、UI のコード ビハインドで検索ボタン イベントを記述することですが、これは MVVM パターンを壊しませんか?

これがばかげた質問である場合は、事前に感謝し、お詫び申し上げます。

4

4 に答える 4

2

問題を解決する良い方法は、User Interaction Patternsを使用することです。

MVVM パターンに関しては、ビュー モデルはユーザーとの対話を開始し、応答を消費して処理する役割を担いますが、ビューは適切なユーザー エクスペリエンスを使用してユーザーとの対話を実際に管理する役割を果たします。ビュー モデルに実装されたプレゼンテーション ロジックと、ビューによって実装されたユーザー エクスペリエンスの間の関心の分離を維持することは、テスト容易性と柔軟性の向上に役立ちます。

MVVM パターンでこの種のユーザー操作を実装するには、2 つの一般的な方法があります。1 つのアプローチは、ビュー モデルがユーザーとの対話を開始するために使用できるサービスを実装することです。これにより、ビューの実装に対する独立性が維持されます。別のアプローチでは、ビュー モデルによって発生するイベントを使用して、ユーザーと対話する意図を表現し、これらのイベントにバインドされ、対話の視覚的側面を管理するビュー内のコンポーネントを使用します。

これは、DialogServices などを実行するための MVVM パターンであるため、要件にも適合します。

于 2012-07-09T10:19:02.903 に答える
1

ここでの主な問題は、MVVM に適した方法で検索ポップアップを表示する方法です。私の github アカウントには、まさにこの目的のために設計されたカスタム コントロールのがあります (完全なソース コードをダウンロードできます)。

コントロールは次のように使用できます。

<c:ModalContentPresenter IsModal="{Binding DialogIsVisible}">

    <!-- This is the main content e.g. your maintenance screen -->
    <TabControl Margin="5">
            <Button Margin="55"
                    Padding="10"
                    Command="{Binding ShowModalContentCommand}">
                This is the primary Content
            </Button>
        </TabItem>
    </TabControl>

    <c:ModalContentPresenter.ModalContent>
        <!-- This is the modal content e.g. your search popup -->
        <Button Margin="75"
                Padding="50"
                Command="{Binding HideModalContentCommand}">
            This is the modal content
        </Button>
    </c:ModalContentPresenter.ModalContent>

</c:ModalContentPresenter>

モーダル コンテンツは、プライマリ コンテンツ (この場合はメンテナンス画面) の上に直接表示され、その可視性はIsModal、viewModel のプロパティにバインドできるプロパティによって制御されます。このプロパティは検索コマンドによって true に設定され、検索グリッドはメンテナンス画面の前に表示されます。

検索画面の「ビュー」には、プロパティを false に設定してポップアップ コンテンツを非表示にする別の ICommand オブジェクトにバインドされた閉じるボタンがあります。

プライマリ コンテンツとモーダル コンテンツの両方が同じコントロールによって管理されるため、情報を「渡す」必要がないことに注意してDataContextください。この場合、viewModel への参照となる同じものを共有します。

于 2012-07-09T10:37:33.663 に答える
0

UIとビューモデル間の直接結合を回避するために、以前はメディエーターを使用して、新しいUI要素の作成をUIクラスに転送しました。しかし、私はこのアプローチに完全に納得したことは一度もないので、誰かがより良い解決策を持っているかどうかを確認することに興味があります。

于 2012-07-09T09:44:51.577 に答える
0

ポップアップを作成するときにダイアログを意味する場合は、このようなダイアログ サービスを使用します。

メンテナンス ビューモデルの opencommand で:

var result = this.uiDialogService.ShowDialog("Dialogwindow title goes here", dialogwindowVM);//in your case the viewmodel for your search

//check the result and just take the SelectedItem from your dialogwindowVM
if(result)
  this._selected = dialogwindowVM.MySelectedItem;
于 2012-07-09T11:17:53.383 に答える