2

場合によっては、ビュー モデルが通知を発生させる必要がある場合があります。これは、ビューが応答して何かを処理し、実行する必要があります。これらをプロパティおよびプロパティ変更通知としてモデル化できない場合。

ビューがイベントをリッスンし、ビュー モデルの通知を宣言型 Xaml マークアップを介してユーザー インターフェイス アクションに変換できるようにする MVVM Light の機能はありますか?

4

4 に答える 4

3

個人的には、VM からイベントを発生させ、ビューでそれらをキャッチする手法は、特定の状況では受け入れられると思います。ただし、特にカスタム イベント引数が必要な場合 (新しいイベント引数クラスと新しいデリゲートを宣言するのは非常に手間がかかるため) には、私は通常、Messenger を使用することを好みます。

また、イベント ハンドラーはビューとビューモデルの間の密結合ですが、通常は疎結合を好みますが、その事実と結果を認識している場合は、なぜ...

もう 1 つの手法 (たとえば、ナビゲーション、ダイアログなど) は、必要なメソッド (AskConfirmation および ShowMessage メソッドを含む IDialogService など) を使用してインターフェイスを宣言することです。次に、クラスにそのインターフェイス (MainWindow/MainPage 自体の場合もあります) を実装させ、それを ViewModel に渡します (たとえば、InitializeComponent が呼び出された直後のビューのコンストラクターで)。VM では、必要に応じてこれらのメソッドを呼び出します。これには、テストが非常に簡単であるという利点があります (単純に IDialogService をモックして、メソッドが呼び出されることを確認します)。

私は通常、さまざまな要因に応じて、Messenger と IDialogService の間を行き来します。ただし、テストが少し簡単なので、最近はインターフェースベースのアプローチを好む傾向があります(ただし、Messengerも非常にテストしやすいため、YMMVです)。

乾杯、ローラン

于 2010-05-17T09:52:56.570 に答える
2

「純粋な」MVVMソリューションでは、ビューをViewModelに接続する必要があるのはバインディングだけです。DataContextをViewModelタイプにキャストし、ビューでイベントをフックすることを妨げるものは何もありませんが、MVVMアプローチを使用する目的をやや損なうことになります。別の方法として、ビューにイベントを発生させる必要があると考える理由を再考してみてください。

  • ポップアップを表示する必要がありますか?ビューモデルがバインドされたコレクションに通知オブジェクトを「挿入」するときに、適切なテンプレートを使用して、さまざまな「ポップアップ通知」のバインドされたリストを使用して、ビューにポップアップを作成できます。
  • ドロップダウンを強制的に開く必要がありますか、または同様のUIアクションが必要ですか?UIの適切なプロパティをビューモデルプロパティにバインドし、モードを双方向に設定し、ビューモデルで適切に設定します。

などなど。

于 2010-05-11T21:09:05.097 に答える
1

ViewModel から View へのメッセージの送信を処理するために、MVVMLight でサポートされている手法が実際にあります。GalaSoft.MvvmLight.Messaging 名前空間の中を見てください。以下の例よりも良い Dialod メッセージの送信方法がありますが、これは簡単な例にすぎません。

ビューモデル

public MainPageViewModel()
{
    Messenger.Default.Send("Payment");
}

意見

public MainPage()
{
    Messenger.Default.Register<string>(this, DialogRequested);
}

private DialogRequested(string message)
{
    MessageBox.Show(message);
}
于 2010-05-14T14:07:16.233 に答える
1

ViewModel が View と通信する必要がある場合があることは間違いありません。これを行う 1 つの方法は、ViewModel が、View がリッスンする CLR イベントを発生させることです。これは、ビューのコード ビハインドで実行できます。

MVVM は、ビューのコード ビハインドを排除することではありません。それは、懸念の分離と、単体テストによるテスト容易性の向上に関するものです。

ViewModel と View の間の通信を可能にするもう 1 つの方法は、インターフェイス (IView) を導入することです。このアプローチの詳細については、WPF アプリケーション フレームワーク (WAF)プロジェクト サイトを参照してください。

于 2010-05-14T10:25:27.313 に答える