我正在将 MVVM 模式应用于一个项目。我有一个 UserControl,它有一个按钮,该按钮绑定(bind)到 ViewModel 公开的命令。
由于按钮是可见的,它不断调用按钮的 CanExecute 方法。有人告诉我这会带来性能损失,但我不确定。这是预期的行为吗?或者有没有更好的方法将按钮绑定(bind)到命令?

谢谢你。

最佳答案

抱歉,我知道发生了什么。
这是 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
}

我错误地认为系统会自动重新查询所有命令。它实际上做的是 Hook 每个 Command 的 CanExecuteChanged 事件,而 RelayCommand 基本上将其 CanExecuteChanged 事件链接到 CommandManager 的 RequerySuggested 事件,因此每次系统“建议”重新查询时,它实际上是重新查询我的所有 RelayCommands。

谢谢你。

关于wpf - Command 中连续 CanExecute 调用的性能损失,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4325751/

10-10 18:45