Нарушение производительности при непрерывных вызовах CanExecute в Command - PullRequest
4 голосов
/ 01 декабря 2010

Я применяю шаблон MVVM к проекту.У меня есть UserControl, который имеет кнопку, которая связана с командой, представленной ViewModel.Поскольку кнопка видима, она непрерывно вызывает метод CanExecute кнопки.Что-то говорит мне, что это влечет за собой снижение производительности, но я не уверен.Это ожидаемое поведение?или есть лучший способ привязать кнопку к команде?

Спасибо.

1 Ответ

1 голос
/ 01 декабря 2010

Извините, я узнал, что происходит.Это реализация 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 с событием RequerySuggested CommandManager, поэтому каждый раз, когда система «предлагает» запрос, он фактически запрашивал все мои RelayCommands.* Спасибо.

...