【问题标题】:CanExecuteChanged event of ICommandICommand 的 CanExecuteChanged 事件
【发布时间】:2011-06-21 13:21:43
【问题描述】:

Icommand 包含两个方法一个事件。

这两种方法的作用很清楚,但是ICommand中提供的我无法理解事件的作用

CanExecuteChanged 事件何时引发?

下面的解释在MSDN上,但我看不懂。

CanExecuteChanged 如果 命令管理器 集中指挥行动 检测指挥变化 可能使已提出但未执行的命令无效的源 尚未由命令绑定执行。

你能简单解释一下吗?

谢谢......

【问题讨论】:

    标签: c# .net wpf icommand


    【解决方案1】:

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

    一般来说,这个事件只是重新暴露CommandManager.RequerySuggested 事件。从 RoutedCommand 类:

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

    RequerySuggested 事件经常被触发,随着焦点的移动,文本选择的改变。这也可以通过调用InvalidateRequerySuggested 手动提出。

    【讨论】:

    • 我有一个删除命令,它从数据网格中删除行,当我将焦点从数据网格移动到 TEXTBOX 时,它不会触发 CanExecuteChanged,正如你所说...我在 ADD 边放了两个书签和 REMOVE 块,但无法在该位置获取指针...
    • @Pritesh - 您必须发布您拥有的代码。如果使用您的命令的元素不可见,则不需要查询您的命令。通常,您只需要在 CanExecute 状态更改时触发该事件。 WPF 将其概括为在他们认为 CanExecute 可能已更改(即焦点更改、选择更改等)时简单地引发事件。
    • 您的回答引发了两个澄清请求:1/“此事件由命令引发”:如果您是从头开始编写命令并且没有明确提出自己事件,是否意味着它永远不会被提出? 2/“一般来说,此事件只是重新公开 CommandManager.RequerySuggested 事件”:add/remove 的默认实现管理对事件的订阅,例如CanExecuteChanged += valueadd。如果您像以前一样覆盖它们,那么客户首先如何订阅该事件?
    【解决方案2】:

    CanExecuteChangedICommandCanExecute 方法发生更改时引发

    在某些第 3 方库中,如果 CanExecute 参数引发 PropertyChanged 事件,也会引发 CanExecuteChanged 事件。例如,如果CanExecute 参数引发PropertyChanged 事件,则MVVM Light Toolkit 的RelayCommand 引发CanExecuteChanged 事件,而Prism 的DelegateCommand 则不会。

    【讨论】:

    • 如何在运行时更改CanExecute 方法?能否请您详细说明....
    • @Pritesh,使用谓词
    • @WingerSendon 我看到有一个替代签名接受对象谓词,但不明白你的意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    相关资源
    最近更新 更多