昨天在專案中遇到一個問題,按鈕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(); } } }
這樣就可以實時觸發了。