場合によっては、ビュー モデルが通知を発生させる必要がある場合があります。これは、ビューが応答して何かを処理し、実行する必要があります。これらをプロパティおよびプロパティ変更通知としてモデル化できない場合。
ビューがイベントをリッスンし、ビュー モデルの通知を宣言型 Xaml マークアップを介してユーザー インターフェイス アクションに変換できるようにする MVVM Light の機能はありますか?
場合によっては、ビュー モデルが通知を発生させる必要がある場合があります。これは、ビューが応答して何かを処理し、実行する必要があります。これらをプロパティおよびプロパティ変更通知としてモデル化できない場合。
ビューがイベントをリッスンし、ビュー モデルの通知を宣言型 Xaml マークアップを介してユーザー インターフェイス アクションに変換できるようにする MVVM Light の機能はありますか?
個人的には、VM からイベントを発生させ、ビューでそれらをキャッチする手法は、特定の状況では受け入れられると思います。ただし、特にカスタム イベント引数が必要な場合 (新しいイベント引数クラスと新しいデリゲートを宣言するのは非常に手間がかかるため) には、私は通常、Messenger を使用することを好みます。
また、イベント ハンドラーはビューとビューモデルの間の密結合ですが、通常は疎結合を好みますが、その事実と結果を認識している場合は、なぜ...
もう 1 つの手法 (たとえば、ナビゲーション、ダイアログなど) は、必要なメソッド (AskConfirmation および ShowMessage メソッドを含む IDialogService など) を使用してインターフェイスを宣言することです。次に、クラスにそのインターフェイス (MainWindow/MainPage 自体の場合もあります) を実装させ、それを ViewModel に渡します (たとえば、InitializeComponent が呼び出された直後のビューのコンストラクターで)。VM では、必要に応じてこれらのメソッドを呼び出します。これには、テストが非常に簡単であるという利点があります (単純に IDialogService をモックして、メソッドが呼び出されることを確認します)。
私は通常、さまざまな要因に応じて、Messenger と IDialogService の間を行き来します。ただし、テストが少し簡単なので、最近はインターフェースベースのアプローチを好む傾向があります(ただし、Messengerも非常にテストしやすいため、YMMVです)。
乾杯、ローラン
「純粋な」MVVMソリューションでは、ビューをViewModelに接続する必要があるのはバインディングだけです。DataContextをViewModelタイプにキャストし、ビューでイベントをフックすることを妨げるものは何もありませんが、MVVMアプローチを使用する目的をやや損なうことになります。別の方法として、ビューにイベントを発生させる必要があると考える理由を再考してみてください。
などなど。
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);
}
ViewModel が View と通信する必要がある場合があることは間違いありません。これを行う 1 つの方法は、ViewModel が、View がリッスンする CLR イベントを発生させることです。これは、ビューのコード ビハインドで実行できます。
MVVM は、ビューのコード ビハインドを排除することではありません。それは、懸念の分離と、単体テストによるテスト容易性の向上に関するものです。
ViewModel と View の間の通信を可能にするもう 1 つの方法は、インターフェイス (IView) を導入することです。このアプローチの詳細については、WPF アプリケーション フレームワーク (WAF)プロジェクト サイトを参照してください。