2011-09-07 8 views
5

ICommandオブジェクトのCanExecuteCommandを使用した場合のパフォーマンスへの影響を教えてください。メソッドは何度も何度も実行されていますか?CanExecuteCommandとパフォーマンスの関係はありますか?

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

+4

はい、ただし、時期尚早に最適化していない場合に限ります。 – Will

+0

コメントは少し曖昧ですか? – Tyrsius

+0

私はまた、完全に理解していません。私の検証は約200のオブジェクトの反復です - ツリービュー。単純なプロパティをチェックするだけで、一度実行すると時間がかかりません。 私の懸念は、CanExecuteが繰り返し実行され、コードが遅くなる場合です。誰かが何らかの光を放つことができますか? – ganeshran

答えて

13

を実行しますICommandインタフェースは以下の通りですん:

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

    // one event 
    event EventHandler CanExecuteChanged; 
} 

CanExecuteChangedイベントは、あなたがCanExecute方法をチェックすべきであることを示すためにしたい任意の時間を提起する必要があります/ WPFによって呼び出されます。 ICommandを実装しているユーザーは、イベントを発生させる必要があり、GUI(WPFシステム)のボタンを有効にした状態を更新する必要がある人は、イベントを登録して処理し、CanExecuteを呼び出します。ジョシュ・スミスのRelayCommandクラスで

が、彼はWPFの内蔵CommandManagerクラスCanExecuteChangedを高めるために使用します。本質的には

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

、WPFのCommandManagerがシングルトンであるルーティングイベントのすべての種類のためのリスニング:KeyUpEvent、MouseUpEvent、その後、RequerySuggestedイベントを起こすことで、みんなに何か面白いことが起こったと伝えます。したがって、RelayCommandを使用している場合は、CommandManagerがGUI上で何か面白いと思われるたびに呼び出されます(あなたのコレクションとは関係ない場合でも)。CanExecuteが呼び出されます。 50のコマンドがある場合は、キーを押すたびに、50のコマンドすべてが再チェックされます。そう、はい、このになる可能性があります。しかし、あなたのCanExecuteメソッドのロジックが本当にシンプルなのであれば、それはおそらく問題ではありません。テイクアウェイポイント:CanExecuteメソッドでデータベースAPIまたはネットワークAPI呼び出しを作成しないでください。

ICommand.CanExecuteChangedイベントを発生させるCommandManager.RequerySuggestedをオフに便乗する代わりに、あなた自身のチェックを行う場所RelayCommandのバージョン自分で自分をロールバックし、手動CanExecuteChangedを上げる、またはプリズムのフレームワークのDelegateCommandクラス、彼らはネクタイしないでくださいを見ていますCommandManagerに入力してください。手動でCanExecuteChangedイベントを発生させる必要があります。これは、おそらくPropertyChangedのリスナーを作成して、コマンドでCanExecuteChangedを発生させることで可能です。

私は上記の@ウィルに同意します。 RelayCommandはおそらく問題のない時間の80%以上を処理します。パフォーマンス上の問題が発生した場合は、独自のバージョンのRelayCommandを作成するか、プリズムDelegateCommandを使用してCanExecuteChangedを手動で上げることができます。

+0

関連の答え:http://stackoverflow.com/questions/6634777/what-is-the-actual-task-of-canexecutechanged-and-commandmanager-requerysuggested – Kendrick

+0

ありがとうKendrickとWill、あなたの答えは私のためにそれを合計しました。私はそれをCanExecuteに入れ、パフォーマンスの遅れを探します。私が見つけたら、他の実装を見ます – ganeshran

0

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

関連する問題