4

MVVMパターンをプロジェクトに適用しています。ViewModelによって公開されたコマンドにバインドされたボタンを持つUserControlがあります。ボタンが表示されているため、ボタンのCanExecuteメソッドを継続的に呼び出しています。これにはパフォーマンスの低下が伴うとのことですが、よくわかりません。これは予想される動作ですか?または、ボタンをコマンドにバインドするためのより良い方法はありますか?

ありがとうございました。

4

1 に答える 1

1

申し訳ありませんが、何が起こっているのかわかりました。これはRelayCommandの実装です。

public class RelayCommand : ICommand
{
    #region Fields

    readonly Action<object> _execute;
    readonly Predicate<object> _canExecute;

    #endregion // Fields

    #region Constructors

    public RelayCommand(Action<object> execute)
        : this(execute, null)
    {
    }

    public RelayCommand(Action<object> execute, Predicate<object> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");

        _execute = execute;
        _canExecute = canExecute;
    }
    #endregion // Constructors

    #region ICommand Members

    [DebuggerStepThrough]
    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute(parameter);
    }

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

    public void Execute(object parameter)
    {
        _execute(parameter);
    }

    #endregion // ICommand Members
}

システムがすべてのコマンドを自動的に再クエリしていると誤って想定していました。実際には、各コマンドのCanExecuteChangedイベントにフックし、RelayCommandは基本的にそのCanExecuteChangedイベントをCommandManagerのRequerySuggestedイベントにリンクするため、システムが再クエリを「提案」するたびに、実際にはすべてのRelayCommandを再クエリしていました。

ありがとうございました。

于 2010-12-01T17:41:37.933 に答える