【问题标题】:WPF Custom ICommand implementation and the CanExecuteChanged eventWPF 自定义 ICommand 实现和 CanExecuteChanged 事件
【发布时间】:2010-09-22 10:22:57
【问题描述】:

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

Command="viewModel:MessageListViewModel.DeleteMessagesCommand"

我不喜欢这个指向我的 ViewModel 类的静态链接,我认为这不如创建自定义 ICommand 实现并使用类似以下的语法

Command="{Binding DeleteMessagesCommand}"

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

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

【问题讨论】:

    标签: wpf binding icommand


    【解决方案1】:

    只需实现CanExecuteChanged事件如下:

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

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

    【讨论】:

    • 非常感谢您提供如此简洁的回复!奇迹般有效。您是否知道 RequerySuggested 何时以及为何被解雇?
    【解决方案2】:

    我非常喜欢 Prism 的 DelegateCommand 实现用于视图模型绑定 (http://msdn.microsoft.com/en-us/library/ff654132.aspx)。您可以通过调用 RaiseCanExecuteChanged 在每个命令调用程序上调用 CanExecute()。

    简单使用示例:

    public class ViewModel
    {
       public ViewModel()
       {
          Command = new DelegateCommand<object>(x => CommandAction(), x => CanCommandAction());
       }
    
       bool state;
    
       public void ChangeState(bool value)
       {
          state = value;
          Command.RaiseCanExecuteChanged();
       }
    
       public DelegateCommand<object> Command {get; private set;}
    
       private void CommandAction()
       {
          //do smthn
       }
    
       private bool CanCommandAction() { return true == state; }
    }
    
    //and binding as usual
    Command="{Binding Command}"
    

    【讨论】:

    • 感谢您的想法,但是 - 正如我们所知 - “权力越大,责任越大”...
    • 抱歉,按 Enter 太快了。我的意思是:在给我机会的同时,它也迫使我这样做以获得通知。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多