ICommandオブジェクトのCanExecuteCommandを使用することのパフォーマンスへの影響は何ですか。メソッドは何度も実行されますか?
コマンドにバインドされたボタンを有効にするかどうかを決定するために、約200個のオブジェクトのコレクションを反復処理する必要がありますか?CanExecuteCommandが繰り返し実行されるため、アプリケーションが遅くなりますか?
ICommandオブジェクトのCanExecuteCommandを使用することのパフォーマンスへの影響は何ですか。メソッドは何度も実行されますか?
コマンドにバインドされたボタンを有効にするかどうかを決定するために、約200個のオブジェクトのコレクションを反復処理する必要がありますか?CanExecuteCommandが繰り返し実行されるため、アプリケーションが遅くなりますか?
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呼び出しを行わないでください。CanExecute
CommandManager
CanExecute
CanExecute
CommandManager.RequerySuggested
イベントを発生させるため に便乗する代わりに、独自のチェックを行って手動で発生させるICommand.CanExecuteChanged
独自のバージョンをロールバックするか、Prismフレームワークのクラスを確認することもできます。このクラスは、それらが結びついておらず、手動で発生させる必要があります。、これはおそらく、のリスナーを作成してからコマンドを起動することで実行できます。RelayCommand
CanExecuteChanged
DelegateCommand
CommandManager
CanExecuteChanged
PropertyChanged
CanExecuteChanged
上記の@Willに同意します。RelayCommand
おそらく問題なく80%以上の時間動作します。パフォーマンスの問題を見つけ始めた場合は、RelayCommandの独自のバージョンを作成するか、Prismを使用して手動でDelegateCommand
レイズすることができます。CanExecuteChanged
将来のグーグルのために:私は多少異なるコマンド実装を作成しました。1つは、ViewModelBaseクラスのOnPropertyChangedイベントにバインドされますが、一方向の場合など、プロパティの変更に関係なく、ビューモデルがその中のすべてのCommandインスタンスに対してCanExecuteChangedイベントを発生させることもできます。ソースバインディングシナリオへ。このソリューションは、PerrypheralFrameowrk.WPFアセンブリの一部であり、nugetおよびcodeplexで利用できます。調べる。codeplex wikiには詳細なドキュメントがあり、アセンブリ内のクラスも同様です。