6

この質問が以前に議論されたか、近くの巨大なプリズムおよび mvvm ブログで間接的に回答されたかどうかを厳密に判断しないでください。RelayCommand または DelegateCommand クラスの WPF 実装には、そのようなイベント ハンドラがあります。

/// <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 アプリはまったく処理しません。

事前に感謝し、私の英語で申し訳ありません -)

4

2 に答える 2

5

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

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

MVVMアプリケーションのWPFの例を採用しようとすると、コマンドのすべての使用を取り除き、独自のコードに置き換える必要があります。この例のコードは、Silverligtでは意味がありませんが、WPFでは、ビューのコントロールが有効になっているか、表示されているかなどを判断するプロセスに関与しています。

于 2009-08-10T19:58:10.877 に答える
5

Silverlight 4.0 は ICommand インターフェイスをサポートしているため、WPF のようなコマンド インフラストラクチャを提供します。

于 2010-03-10T16:14:05.283 に答える