6

ICommandオブジェクトのCanExecuteCommandを使用することのパフォーマンスへの影響は何ですか。メソッドは何度も実行されますか?

コマンドにバインドされたボタンを有効にするかどうかを決定するために、約200個のオブジェクトのコレクションを反復処理する必要がありますか?CanExecuteCommandが繰り返し実行されるため、アプリケーションが遅くなりますか?

4

2 に答える 2

14

ICommandインターフェイスは次のとおりです。

public interface ICommand
{
    // two methods
    bool CanExecute(object parameter);
    void Execute(object parameter);

    // one event
    event EventHandler CanExecuteChanged;
}

メソッドがWPFによってチェック/呼び出される必要があることを示したい場合は、CanExecuteChangedいつでもイベントを発生させる必要があります。CanExecute実装ICommandする人は誰でもイベントを発生させる必要があり、GUI(WPFシステム)でボタンが有効な状態を更新する必要がある人は誰でもイベントに登録して処理する必要があり、それが呼び出しますCanExecute

Josh SmithのRelayCommandクラスでは、彼はWPFの組み込みクラスを使用CommandManagerして以下を発生させCanExecuteChangedます。

public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}

本質的に、WPFCommandManagerは、KeyUpEvent、MouseUpEventなどのあらゆる種類のルーティングされたイベントをリッスンするシングルトンであり、イベントを発生させることで「何か面白いことが起こった」と全員に伝えますRequerySuggested。したがって、を使用している場合は、GUIで何か面白いことが起こったと考えるたびに呼び出されRelayCommandます(コレクションとは関係がない場合でも)。50個のコマンドがある場合、キーを押すたびに、50個すべてのコマンドが再チェックされます。そうです、これはパフォーマンスの問題である可能性があります。ただし、メソッドのロジックが本当に単純な場合は、おそらく問題ではありません。要点:メソッドでデータベースまたはネットワークAPI呼び出しを行わないでください。CanExecuteCommandManagerCanExecuteCanExecute

CommandManager.RequerySuggestedイベントを発生させるため に便乗する代わりに、独自のチェックを行って手動で発生させるICommand.CanExecuteChanged独自のバージョンをロールバックするか、Prismフレームワークのクラスを確認することもできます。このクラスは、それらが結びついておらず、手動で発生させる必要があります。、これはおそらく、のリスナーを作成してからコマンドを起動することで実行できます。RelayCommandCanExecuteChangedDelegateCommandCommandManagerCanExecuteChangedPropertyChangedCanExecuteChanged

上記の@Willに同意します。RelayCommandおそらく問題なく80%以上の時間動作します。パフォーマンスの問題を見つけ始めた場合は、RelayCommandの独自のバージョンを作成するか、Prismを使用して手動でDelegateCommandレイズすることができます。CanExecuteChanged

于 2011-09-07T15:28:56.077 に答える
0

将来のグーグルのために:私は多少異なるコマンド実装を作成しました。1つは、ViewModelBaseクラスのOnPropertyChangedイベントにバインドされますが、一方向の場合など、プロパティの変更に関係なく、ビューモデルがその中のすべてのCommandインスタンスに対してCanExecuteChangedイベントを発生させることもできます。ソースバインディングシナリオへ。このソリューションは、PerrypheralFrameowrk.WPFアセンブリの一部であり、nugetおよびcodeplexで利用できます。調べる。codeplex wikiには詳細なドキュメントがあり、アセンブリ内のクラスも同様です。

于 2014-11-01T21:56:52.097 に答える