ICommandオブジェクトのCanExecuteCommandを使用した場合のパフォーマンスへの影響を教えてください。メソッドは何度も何度も実行されていますか?CanExecuteCommandとパフォーマンスの関係はありますか?
コマンドにバインドされたボタンを有効にするかどうかを決定する約200個のオブジェクトのコレクションを反復処理する必要がありますか? CanExecuteCommandは、私のアプリケーションが遅くなりますどの繰り返し
ICommandオブジェクトのCanExecuteCommandを使用した場合のパフォーマンスへの影響を教えてください。メソッドは何度も何度も実行されていますか?CanExecuteCommandとパフォーマンスの関係はありますか?
コマンドにバインドされたボタンを有効にするかどうかを決定する約200個のオブジェクトのコレクションを反復処理する必要がありますか? CanExecuteCommandは、私のアプリケーションが遅くなりますどの繰り返し
を実行します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
を手動で上げることができます。
将来のgooglerの場合: 私は若干異なるコマンド実装を作成しました。 1つは、ViewModelBaseクラスのOnPropertyChangedイベントにバインドされていますが、ViewModelBaseクラスのプロパティの変更に関係なく、ViewModel内のすべてのCommandインスタンスに対してCanExecuteChangedイベントを発生させることもできますソースバインディングシナリオへ。 このソリューションはPerrypheralFrameowrk.WPFアセンブリの一部で、nugetとcodeplexで利用できます。調べる。 codeplex wikiには詳細なドキュメントがあり、アセンブリ内のクラスも同様です。
はい、ただし、時期尚早に最適化していない場合に限ります。 – Will
コメントは少し曖昧ですか? – Tyrsius
私はまた、完全に理解していません。私の検証は約200のオブジェクトの反復です - ツリービュー。単純なプロパティをチェックするだけで、一度実行すると時間がかかりません。 私の懸念は、CanExecuteが繰り返し実行され、コードが遅くなる場合です。誰かが何らかの光を放つことができますか? – ganeshran