即使在WPF中提供CommandParameter后,按钮仍未启用

我创建了一个按钮,其命令参数设置和命令使用实现ICommand接口的类。 但是我的按钮被禁用了。 这是为什么? 我从这里得到了这个代码: ICommand就像一块巧克力蛋糕

         

我的class级是

 class HelloWorldCommand:ICommand { public bool CanExecute(object parameter) { return parameter != null; } public event EventHandler CanExecuteChanged; public void Execute(object parameter) { MessageBox.Show(parameter.ToString()); } } 

嗯,这是非常非常简单的ICommand实现。

正如@JleruOHeP所说,部分问题可以通过交换CommandCommandParameter setter来解决。 但这很丑陋,因为你必须每次都记住这个序列。

更正确的方法是告诉CommandManager重新查询命令状态:

 public class HelloWorldCommand : ICommand { public bool CanExecute(object parameter) { return parameter != null; } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } public void Execute(object parameter) { MessageBox.Show(parameter.ToString()); } } 

现在,制定者的顺序是无关紧要的。
要了解CommandManager工作原理,您可以阅读Josh Smith撰写的这篇精彩文章。

最简单的答案 – 切换Command和Command参数的位置:

  

但是@Dennis给出了更好的一个

在我的情况下,导致问题的是CommandParameter类型。 我的按钮就像这样绑定:

  

底层的NewCommand是一个RelayCommand 。 不知何故,XAML无法将False转换为bool。 (请注意,它适用于许多内置类型和属性;可能有一些TypeConverter或其他操作)。

解决方案是简单地向XAML提供有关CommandParameter真正基础类型的提示,如下所示:

  

您必须在XAML文件的顶部导入sys命名空间,如下所示:

 xmlns:sys="clr-namespace:System;assembly=mscorlib" 

希望这可以帮助有人在路上。