WPF Command CanExecute 触发一次的问题

昨天在项目中遇到一个问题,按钮bind了Command后,利用CanExecute控制它的是否可点击。结果却在初始化viewmodel的时候执行了一次CanExecute,之后一直不触发,按钮的可用性状态也一直不改变。


image.png

<pre>
public DelegateCommand NewCommand { get; set; }
public DelegateCommand CheckCommand { get; set; }
</pre>


image.png
image.png

看了半天,也没看出啥原因,以为是控件的问题,后来又换成普通的Button,结果还是一样,只触发一次。

后来查资料,才知道需要用CommandManager注册下。
修改后代码如下
<pre>
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();
}
}
}
</pre>
这样就可以实时触发了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、概述 Databinding 是一种框架,MVVM是一种模式,两者的概念是不一样的。我的理解DataBindi...
    Kelin阅读 76,890评论 68 521
  • 2017.02.22 可以练习,每当这个时候,脑袋就犯困,我这脑袋真是神奇呀,一说让你做事情,你就犯困,你可不要太...
    Carden阅读 1,378评论 0 1
  • MVVM架构 自然是按照ViewModel、ViewController、View、Model的顺序依次构建。 R...
    Carden阅读 1,116评论 0 4
  • 我们的一生像一个方程式,方程式的左边是我们种种的经历——我们获得的财富,地位,名声等,方程式的终点却都是一样——死...
    勤奋虎哥阅读 570评论 1 3
  • 为期半个月的会议今天就要落下帷幕了,最后一场在唐山工业职业学院,很漂亮的一个学校,像一个城堡一样,位于曹妃甸工业区...
    洒满阳光的路阅读 724评论 0 0