WPF 自定义 ICommand 实现和 CanExecuteChanged 事件

标签 wpf binding icommand

在我的 WPF UI 中,我使用了我在 xaml 中通过以下代码引用的 RoutedCommands:

Command="viewModel:MessageListViewModel.DeleteMessagesCommand"

我不喜欢这个指向我的 ViewModel 类的静态链接,我认为这不如创建自定义 ICommand 实现并使用如下语法
Command="{Binding DeleteMessagesCommand}"

创建了一个之后,我注意到我所做的一个主要缺点:RoutedCommands 利用 CommandManager 并且(以某种对我来说完全不透明的方式)触发 CommandManager.RequerySuggested 事件,以便自动重新查询它们的 CanExecute 方法。至于我的自定义实现,CanExecute 仅在启动时触发一次,之后再也不会触发。

有没有人对此有一个优雅的解决方案?

最佳答案

只需执行 CanExecuteChanged事件如下:

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

当您将命令分配给控件时,它会订阅 CanExecuteChanged事件。如果您将其“重定向”到 CommandManager.RequerySuggested事件,每当CommandManager.RequerySuggested时都会通知控件被触发。

关于WPF 自定义 ICommand 实现和 CanExecuteChanged 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3768301/

相关文章:

c# - 如何使图钉可在 bingmap wpf 中的 map 上拖动

c# - WPF 组合框 : Wrong Item is displayed

mvvm - WPF MVVM 命令 CanExecute,仅在焦点更改时重新评估

c# - 异步 ICommand 实现

c# - 将图像设置为图像源时覆盖(重新保存)图像时出现问题

c# - 在 WPF 中创建自定义安装程序

c# - 从Button更新文本框,单击C#

silverlight - 如何在 silverlight 中使用集合类作为静态资源

swift - 将 swift 属性的值绑定(bind)到 viewModel 的属性

c# - 使用按钮打开 WPF 弹出窗口