20

CanExecuteChanged を使用して「実行可能」条件を変更できますか?

それとも... 「何のために」使用されますか?

4

3 に答える 3

26

いいえ、実行可能状態を変更するために使用することはできません。これはイベントであり、パターンに参加するオブジェクトはICommandこのイベントをリッスンすることを選択できます。たとえば、ボタンはこのイベントを使用して、(can execute メソッドを呼び出して) コマンドの状態を再クエリして有効な状態に設定するタイミングを知ることができます。

can execute パターンが有用であるためには、イベントを発生させるために使用できる何かが必要です。PrismDelegateCommandには、このイベントを手動で発生させるために呼び出すことができるメソッドがあるため、サブスクライバーは、パターンを選択した場合に実行可能メソッドを再クエリします。

  • コマンドをボタンに割り当てます。
  • サブスクライブするボタンは、変更されたイベントを実行できます。
  • ボタン実行はメソッドを実行でき、false を返します - ボタンを無効にします。
  • 依存するメソッドを実行できる状態を変更します。
  • Raise を呼び出すと、Prism コマンドで変更を実行できます。
  • 変更されたイベントを実行できます。
  • ボタン イベント ハンドラが起動します。
  • ボタン呼び出しコマンドはメソッドを実行できます - ボタンは有効です。

次の Prism ベースの例では、保存コマンドの実行中に SaveCommand の状態をCanExecutefalse から true に変更します。への呼び出しRaiseCanExecuteChangedにより、CanExecuteChangedイベントが発生し、クライアントがCanExecuteメソッドを呼び出します。実際には、これSaveCommandにより、状態を有効から無効に変更し、再び有効に戻すようにバインドされた [保存] ボタンが作成されます。

public class BlingViewModel
{
    private DelegateCommand<object> _saveCommand;
    private bool _canSaveExecute = true;

    public ICommand SaveCommand
    {
        get
        {
            if (_saveCommand == null)
            {
                _saveCommand = new DelegateCommand<object>
                    (
                    executeMethod: _ => Save()
                    ,
                    canExecuteMethod: _ => _canSaveExecute
                    );
            }
            return _saveCommand;
        }
    }

    private void Save()
    {
        _canSaveExecute = false;
        _saveCommand.RaiseCanExecuteChanged();

        Console.WriteLine("Saving...");

        _canSaveExecute = true;
        _saveCommand.RaiseCanExecuteChanged();
    }
}
于 2010-12-25T19:29:07.820 に答える
9

または、ハンドラーが再評価されるSystem.Windows.Input.CommandManager.InvalidateRequerySuggested()ように呼び出すだけです。CanExecute

于 2011-05-26T16:20:44.913 に答える