昨天在项目中遇到一个问题,按钮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();
}
}
}

这样就可以实时触发了。

WPF Command CanExecute 触发一次的问题的更多相关文章

  1. wpf Command canExecute 更新

    可以调用以下语句通知 CommandManager.InvalidateRequerySuggested();

  2. A memory leak issue with WPF Command Binding

    Background In our application, we have a screen which hosts several tabs. In each tab, it contains a ...

  3. silverlight wpf Command提交时输入验证

    silverlight 或WPF在MVVM模式中使用INotifyDataErrorInfo接口对输入进行验证时 控件lostFocus时会触发验证,但在提交动作(例如button的Command)时 ...

  4. WPF 后台数据触发改变界面状态-心跳实现

    今年做的一个上位机工控WPF项目,做个小小的总结把,以后随时来找 请不要带血乱喷,我只是菜鸟.___by 鲍队 类似于这样子的;大致的意思是:一个代码变量,通过改变变量的值,绑定这个变量的这个圆颜色也 ...

  5. WPF Command Binding

    <Window x:Class="WpfTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/200 ...

  6. WPF Command命令模式

    //定义接口 public interface IView { bool IsChanged { get; set; } void SetBinding(); void Clear(); } //定义 ...

  7. WPF之无法触发KeyDown或者KeyUp键盘事件

    有时候我们可能在Panel(StackPanel.Canvas.Grid)上或者是在一些默认不支持Focus的控件上添加了KeyDown或者KeyUp,可是残酷的现实告诉我们,这是无法触发的,怎么办呢 ...

  8. WPF Command

    使用CustomControl时绑定Command用法 C# Part public static RoutedUICommand ClearCommand { get; private set; } ...

  9. 【WPF】代码触发Button点击事件

    先定义Button按钮并绑定事件. public void test() { Button btn = new Button(); btn.Click += Btn_Click; } private ...

随机推荐

  1. Minimum Window Substring LT76

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  2. Vue 使用中的小技巧

    在vue的使用过程中会遇到各种场景,当普通使用时觉得没什么,但是或许优化一下可以更高效更优美的进行开发.下面有一些我在日常开发的时候用到的小技巧,在下将不定期更新~ 1.多图表resize事件去中心化 ...

  3. Netsharp下微信菜单以及OAuth

    一.OAuth介绍 在微信开发中,当打开一个页面是,业务场景一般会基于粉丝绑定用户信息,即页面需要基于粉丝和用户的身份处理业务逻辑. 在微信中打开一个页面有三个场景: 1.文本回复中直接包含url 2 ...

  4. maven clean package 时出现Failed to read artifact descriptor for的问题解决

    maven clean package 时出现Failed to read artifact descriptor for的问题 [ERROR] Failed to execute goal on p ...

  5. 如何上传Packages到PyPI并批量抓取

    1.如何上传包到PyPI ? 更新中... 2.批量抓取simple网站第三方模块 https://pypi.python.org/simple/ 3. 第三方模块的安装和使用 python  set ...

  6. 经典矩阵快速幂之二-----hdu2157(走k步到

    题意:(中问题,题意很简单 思路:a走k步到b,其实就是A^k,ans.mat[a][b]就是答案. 其实就是离散的邻接矩阵那个P(不想证明,逃 #include<cstdio> #inc ...

  7. Unity3d 插值Lerp与Slerp

    Lerp Lerp表示线性插值. Slerp 球形插值在Vector3.Quaternion等类都有使用,一般多在Quaternion的旋转操作时使用.

  8. vue的子传父

    子组件传值给父组件,需要触发一个事件. 在这个事件里,使用this.$emit("父组件使用的名称","子组件的数据") 在父组件中引用的子组件,在子组件的标签 ...

  9. s4-4 以太网概述

    以太网所处的位置 以太网的发展史 1973 Robert Metcalfe及其同事设计了以太网雏形(施乐公司) 1980 DIX发布最早的以太网标准,开放标准 1985 IEEE802.3对以太网作了 ...

  10. CYS-Sqlite数据导入工具

    界面: 曹永思 下载地址:asp.net 2.0版 Sqlite数据导入工具.zip 欢迎转载,转载请注明出处,希望帮到更多人.