即使在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所说,部分问题可以通过交换Command
和CommandParameter
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"
希望这可以帮助有人在路上。