2009-08-10 14 views
6

この質問が以前に議論されたのか、巨大な近くのプリズムやmvvmのブログで間接的に答えられたのか厳密には判断しないでください。 RelayCommand又はDelegateCommandクラスのWPF実装で そのようなイベントハンドラSilverlightのMVVM(ICommand)

/// <summary> 
/// Occurs whenever the state of the application changes such that the result 
/// of a call to <see cref="CanExecute"/> may return a different value. 
/// </summary> 
public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 

があるが、名前空間のSLサブセットにないCommandManagerのクラスが存在しません。そして、これは私が立ち往生したところです。私はまだSLのMVVM採用でこれを回避する方法を見つけていません(PRISMは私にとってまだ複雑です)。異なる単純なHelloWorldMVVMアプリケーションはまったく対処しません。

事前のおかげで、私の英語のため申し訳ありません - )

答えて

5

Silverlightのコマンドはサポートされていません。ユーザーがビュー内のコントロールを操作するときは、ビューのコードビハインドでビューモデルを変更するコード(イベントハンドラなど)を記述する必要があります。これは、ユーザーがビュー内のボタンをクリックしたときに、ビューモデル上のメソッドを呼び出すのと同じくらい簡単なことかもしれません。 PRISMを使用すると、ビューのXAMLに添付されたプロパティを作成してこれらのイベントハンドラを取り除くことができますが、PRISMを使用しない場合はイベントハンドラを使用するだけで済みます。

もう1つの側面は、ビューモデルが変更されたときにビューを変更することです。特に、ビューモデルの状態に基づいてコントロールを有効または無効にする必要があります。これを実現するには、コントロールのIsEnabledプロパティを、特定の操作が許可されているかどうかを反映するビューモデルのものにバインドする必要があります。ブール値に変換するカスタムのIValueConverterオブジェクトを実装すると便利なことがよくあります。たとえば、ビューモデルにカウントを表すプロパティがあり、カウントがゼロより大きい場合にのみビュー内の特定のコントロールを有効にする場合は、数値が大きいほどtrueに変換される値コンバータを作成できますこの値変換器をバインディングに使用します。

MVVMアプリケーションのWPFの例を適用しようとすると、コマンドのすべての使用を取り除き、独自のコードを置き換える必要があります。あなたの例のコードSilverligtに有意義ではなく、ビューの制御が有効な場合WPFでそれを決定するプロセスに関与し、可視等

+0

私はあなたが少し間違っていると思います - Silverlight 2にはICommandのサポートがあります(制限されているかもしれませんが、ICommandクラスが存在します)。 –

+1

'ICommand'インターフェースはSilverlightで定義されていますそれはどこにも使用されておらず、SilverlightではMVVMパターンでうまく動作するWPFのコマンドインフラストラクチャ全体が存在しません。 –

+0

ありがとうございます。私はICommandの存在が完全なサポートを意味すると考えていたので、私は間違っていました - (したがって、SLのMVVMの実装はWPFのように簡単ではないことが判明しました。これは: http://blogs.southworks.net/jdominguez/2008/08/icommand-for-silverlight-with-attached-behaviors/ または多くのイベントが含まれている準備が整ったフレームワークを使用しています。 http:// nroute。 codeplex.com –

5

シルバー4.0のICommandインターフェースをサポートし、したがって、WPFを提供しますインフラストラクチャーのような指揮する。

関連する問題