昨天在项目中遇到一个问题,按钮bind了Command后,利用CanExecute控制它的是否可点击。结果却在初始化viewmodel的时候执行了一次CanExecute,之后一直不触发,按钮的可用性状态也一直不改变。
public DelegateCommand NewCommand { get; set; } public DelegateCommand CheckCommand { get; set; }
看了半天,也没看出啥原因,以为是控件的问题,后来又换成普通的Button,结果还是一样,只触发一次。
后来查资料,才知道需要用CommandManager注册下。
修改后代码如下
public class DelegateCommand : ICommand { Action _action; Func<bool> _canAction; public DelegateCommand(Action action) { _action = action; } public DelegateCommand(Action action, Func<bool> canAction) { _action = action; _canAction = canAction; } public bool CanExecute(object parameter) { if (_canAction == null) { return true; } return _canAction.Invoke(); } //public event EventHandler CanExecuteChanged; public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } public void Execute(object parameter) { if (_action != null) { _action.Invoke(); } } }
这样就可以实时触发了。