MVVMソリューションを探しています。コントロールはビューで使用されます(Vと呼びます)。コントロールにはメソッドFoo()があります。その操作はコントロールのどのイベントにも接続されていないため、そのメソッドをイベントから呼び出すことはできません。ViewModelからこのメソッドを呼び出す必要がありますが、もちろんViewModelにはビューに関する知識がありません。コントロールを拡張してMVVM準拠のV.Foo()の呼び出しを有効にする方法について何かアイデアはありますか?
4 に答える
受け入れられなかった質問を確認したところ、これが見つかりました。コントロールにICommanddependecyプロパティを
追加することで問題を解決したことを覚えています。これは、更新なしでOneWayToSourceを使用してバインドされます。Execute()呼び出しは、コントロールのメソッドを呼び出します。
「もちろん、ViewModelにはビューに関する知識がありません」?
MVVMをドーピングしている場合、ViewModelはViewを認識している必要があります。
RoutedCommandまたはRelayCommandを調べる必要があるかもしれません
ビューモデルで、操作を実行するようにビューに通知するブール値を作成します。コントロールにアクセスできる場合は、前述のブール値にバインドできる依存関係プロパティを作成し、変更時にメソッドを呼び出します。依存関係プロパティを作成する機能がない場合は、作業を実行する動作を作成します。
このような場合、私は通常、Messenger(MVVMLightなど)/ Mediator / EventAggregator(Prismなど)のパターンを使用して、メソッドを実行する必要があることをビューに通知します。このようなパターンでは、基本的に、誰がメッセージを処理するかを知らなくても、VMから一部の受信者(この場合はビュー)にメッセージを送信します。したがって、ビューモデルはビューを知る必要はありません。
さらに、このパターンを使用して、送信者が知らないうちに、多くの受信者を処理できる一般的なブロードキャストメッセージを作成できます。
例:
と
PS:
このようなアプローチには多くの有効なケースがあります。ただし、別の解決策がある場合は、ViewModelからビューを呼び出すことは避ける必要があると言わなければなりません。
ビューモデルからのビューへのアクセスを批判する人へ:MVVMは、ルールを強制するのではなく、代替手段を提供することによってユーザーに権限を与えることを目的としていることに注意してください。