2

私は MVVM パターンを使用して WPF で作業していますが、WPF と MVVM の両方のニュアンスに頭を悩ませているため、一般的にはうまく機能しているようです。しかし、私は現在、特定の問題で立ち往生しています。私の実際のアプリケーションはかなり複雑なので、単純化するために、パターンに関する Josh Smith のほぼ定義的な記事を取り上げ、その中でアプリケーションを使用してみましょう。

図 2 を考えてみましょう。ユーザーが名前と姓のフィールドに何かを入力したとします。次に、ユーザーは、別の顧客タブをクリックするか、同じアプリケーション内のまったく異なるビューモデルをクリックして、ワークスペース (ビューモデル) から完全に離れます。この場合、私が望んでいるのは、アプリケーションが「変更を保存しますか? はい/いいえ/キャンセル」と尋ね、適切に応答することです。これは...課題を提示しました。

ユーザーが最初のパスで PreviewLostKeyboardFocus が必要であることを「キャンセル」できるようにしたいので (Handled=true を設定してフォーカスシフトをキャンセルできるため)。ただし、一部のユーザー アクション (別のワークスペースのタブをクリックするなど) では、キーボード フォーカスが移動しません。LostFocus はその点で私をよりよくカバーしますが、それはフォーカスが既に失われた後でのみ (もちろん、元に戻すことはできますか?)、イベントがビュー自体からのものであったかどうかを判断する際に問題があります (つまり、フォーカスを離れています)。ビュー全体) または含まれているオブジェクトから単純にバブルアップした場合。

そして、これらすべての全体像-これはビューの問題のようですが、それは魔法のビューモデルではなくビューでコードを書くことを意味します. これは、私がこれを正しく見ていないと私に思わせます。

ですから、このすべてを明確にする大きな概念的なa-haが欠けていることを願っています. ヘルプ?

4

1 に答える 1

3

ビューではなくモデルに集中する必要があります。つまり、ロジックをトリガーする変更は何ですか? この場合、アクティブなタブを変更しようとしたときだと思います。

したがって、次の責任を持つ包括的なビュー モデルが必要です。

  • すべてのサブ ビュー モデルのコレクションを公開します (それぞれが独自のタブに表示されます)。
  • アクティブな (選択された) サブ ビュー モデル (つまり、アクティブなタブ) を追跡します。

ビューは、通常の方法でこれらのプロパティにバインドされます。

<TabControl ItemsSource="{Binding Tabs}" SelectedItem="{Binding SelectedTab}"/>

プロパティは、SelectedTab次のようにロジックを適用します。

  1. 現在のタブは汚れていますか?
  2. その場合は、サービスを介してユーザーにプロンプ​​トを表示します
  3. ユーザーがキャンセルした場合、アクティブなタブを変更しないでください
  4. ユーザーが変更を保存または破棄した場合、アクティブなタブを変更します

あなたが見逃している重要なことは、包括的なビューモデルだと思います。私のActiveAwareCommandサンプル プロジェクトを実行すると、理解が深まる可能性があります。

于 2009-08-26T21:02:10.213 に答える