0

我正在尝试使用自定义 委托命令

但是,自动 RaiseCanExecuteChanged 无法正常工作。使用 CommandManagerHelper 是否很好(每次应用程序处于焦点时,它会为每个命令引发 canexecute 更改?或者我必须使用标准 RelayCommand 并自己提高 canexecutechanged ?

谢谢

4

2 回答 2

1

RaiseCanExecuteChanged 事件在自动模式下无法正常工作。因此,每个 UI 交互都有这样的实现来刷新 RequerySuggested 事件的 canExecute 处理程序。代码如下(请记住,ICommand 的这种实现不是性能有效的,但工作起来就像一个魅力):

public class Command<TArgs> : ICommand
{
    public Command(Action<TArgs> exDelegate)
    {
        _exDelegate = exDelegate;
    }

    public Command(Action<TArgs> exDelegate, Func<TArgs, bool> canDelegate)
    {
        _exDelegate = exDelegate;
        _canDelegate = canDelegate;
    }

    protected Action<TArgs> _exDelegate;
    protected Func<TArgs, bool> _canDelegate;

    #region ICommand Members

    public bool CanExecute(TArgs parameter)
    {
        if (_canDelegate == null)
            return true;

        return _canDelegate(parameter);
    }

    public void Execute(TArgs parameter)
    {
        if (_exDelegate != null)
        {
            _exDelegate(parameter);
        }
    }

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

    bool ICommand.CanExecute(object parameter)
    {
        if (parameter != null)
        {
            var parameterType = parameter.GetType();
            if (parameterType.FullName.Equals("MS.Internal.NamedObject"))
                return false;
        }

        return CanExecute((TArgs)parameter);
    }

    void ICommand.Execute(object parameter)
    {
        Execute((TArgs)parameter);
    }

    #endregion
}
于 2013-06-14T10:35:19.537 回答
0

最好的解决方案是使用 RelayCommand 并手动提高 CanExecuteChanged。另一种解决方案无法正常工作。

于 2013-06-17T08:55:19.047 回答