ICommand的CanExecuteChanged事件

26

Icommand 包含两个方法一个事件

这两个方法的作用很清楚,但是提供在 ICommand 中的事件我不明白它的作用

什么时候会触发 CanExecuteChanged 事件?

下面的解释来自于MSDN,但我看不太懂。

如果命令管理器检测到命令源发生了更改,而这可能会使已被触发但尚未被命令绑定执行的命令无效,则会引发CanExecuteChanged事件。

请您简单解释一下这是什么意思吗?

谢谢......

2个回答

27

该事件由命令引发,通知其使用者(即Button、MenuItem等)它的CanExecute属性可能已经改变。因此,如果焦点从一个TextBox移动到另一个TextBox,则您的命令可能需要启用/禁用。这些信息还需要传递给使用您的命令的任何控件。

总体而言,该事件只是重新公开了CommandManager.RequerySuggested事件。来自RoutedCommand类的说明:

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

当焦点移动、文本选择发生变化时,RequerySuggested事件会频繁触发。同时,也可以通过调用InvalidateRequerySuggested方法手动引发该事件。


我有一个删除命令,可以从数据网格中删除行,但当我从数据网格移动焦点到文本框时,它不会触发CanExecuteChanged,就像你所说的那样...我在ADD和REMOVE块中放置了两个书签,但无法在该位置获取指针... - Pritesh
@Pritesh - 你需要发布你所拥有的代码。如果使用你的命令的元素不可见,那么它就不需要查询你的命令。通常情况下,只有在CanExecute状态发生变化时才需要触发该事件。WPF将其概括为仅在他们认为CanExecute可能已更改时引发事件(即随着焦点变化、选择变化等)。 - CodeNaked
1
你的回答引发了两个澄清请求:1/ "此事件由命令引发":如果你从头编写命令并且没有显式地引发事件,那么这是否意味着它永远不会被引发?2/ "通常,此事件仅重新公开CommandManager.RequerySuggested事件": add / remove 的默认实现管理订阅事件,例如CanExecuteChanged += value对于add。如果你像你所做的那样覆盖它们,客户端如何首次订阅事件? - mins

8
“CanExecuteChanged”是当“ICommand”的“CanExecute”方法发生变化时引发的事件。
在某些第三方库中,如果“CanExecute”参数引发了“PropertyChanged”事件,“CanExecuteChanged”事件也会被引发。例如,MVVM Light Toolkit的“RelayCommand”会在“CanExecute”参数引发“PropertyChanged”事件时引发“CanExecuteChanged”事件,而Prism的“DelegateCommand”则不会。

如何在运行时更改“CanExecute”方法?您能详细说明一下吗? - Pritesh
@Pritesh,使用谓词。 - wingerse
@WingerSendon,我看到有一个接受对象谓词的替代签名,但不明白你的意思。 - Ryan Leach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接