1

IEnumerable<MyObject> MyObjectsViewModelにプロパティがあります。2 番目のビュー モデル (最初のビュー モデルを参照する) の特定のコマンドを、MyObjects少なくとも 1 つのオブジェクトが取り込まれている場合は実行可能にしますが、空の場合は実行できないようにします。

私の CanExecute メソッドは次のようになります。

private bool CanExecute()
{
    return this.viewModel.MyObjects.Any();
}

の基になる値MyObjectsが変更されるたびに発生する PropertyChanged イベントがあります。

ロジックは正しく動作しますが、CanExecute() メソッドが常に呼び出されているため、基本的にアプリケーション全体がフリーズします。同時に、MyObjects は変化していません (また、PropertyChanged イベントを発生させていません)。CanExecute が常に再クエリされるのを防ぐ方法はありますか?

4

1 に答える 1

1

コマンドがRoutedCommandCanExecuteChangedを継承しているか、次のように実装していると想定しています。

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

つまり、コマンドにハンドラーを追加することCanExecuteChanged(いつあなたの を呼び出すかを決定するために WPF が行うCanExecute) はCommandManager.RequerySuggested、頻繁に発生する にハンドラーを追加することと同じです。 .

この問題を回避する方法は 2 つあります。

  1. まったく使用しないでください。標準イベントをRequerySuggested作成CanExecuteChangedし、チェックしたいときに具体的に発生させます。

  2. CanExecute実行頻度が問題にならないように、メソッドが非常に高速であることを確認してください。のように記述できますreturn this.viewModel.HasAnyObjects;。ここで、は変更HasAnyObjects時に true または false に設定される単純なフィールドです。MyObjects

于 2013-06-18T18:51:11.173 に答える