2011-01-05 8 views
3

私がSilverlightで実行してきた主な問題の1つは、強力なCommandingサポート(ala WPF)の欠如です。具体的には、コマンドの状態に影響を与える可能性のあるプロパティでRaiseCanExecuteChanged()を手動で呼び出す必要があるため、適切にカプセル化してMVVMパターンをきれいに適用することは非常に困難です。Silverlight 4:RequerySuggested機能を使用した信頼性の高いコマンド?

例として、親子ビューのViewModelに親子ビューがバインドされています。親ビューは、親ViewModel上のコマンドにバインドされます。親ビューには複数の子ビューがあり、それぞれが子ビューモデルにバインドされた一連の組み込みコントロール(テキストボックス、コンボボックスなど)を含むユーザーコントロールです。

親コマンドの状態(すなわち、実行可能かどうか)は、各子コントロールの状態に基づいています。たとえば、すべての子ユーザーコントロールのすべてのテキストボックスに有効な値が設定されている必要があります。これには、これらのコントロールが各呼び出しRaiseCanExecuteChanged()にバインドするプロパティが必要です。つまり、ICommand自体、またはRaiseCanExecuteChanged()メソッドを呼び出す代理人の知識が必要です。

コマンドやデリゲートを注入すると、上記のより複雑な状況、たとえば3層以上のコントロールがある場合など、私には間違っていると感じられます。これらの参照はチェーン全体に渡る必要があります。また、子供がインスタンス化されるたびに、コマンドやデリゲートを追加する余分な手順を取らなければならないので、もう少しハウスキーピングです。

SilverlightがWPFのようなCommandManager.RequerySuggested機能をサポートしていれば、これはもっと簡単になります。

私は、Silverlight(one such article)にRequerySuggestedを実装することができたことを示唆している記事を見てきましたが、信頼性が高く適切に実行されているかどうかについての解説はほとんどありません。

他の人がSilverlightでこの制限を回避する方法はありますか?

答えて

4

私が過去に使用した方法の1つは、Laurent BugnionのMVVM Lightフレームワーク(http://blog.galasoft.ch/archive/2009/09/27/mvvm-light-toolkit-messenger-v2-beta.aspx)のメッセージングエンジンを使用することです。

本質的に、子どもたちは、コマンドを要求するメッセージを送信します。親に座ることができるリスナーは、メッセージに応答してRaiseCanExecuteChanged()を呼び出します。

私はMVVM Lightがメッセージングエンジンの価値があることを発見しました。親ビューが配置されている場合は、リスナーを慎重に登録解除する必要があります。

希望に役立ちます。

関連する問題