有谁知道为什么特定的MVVM Light RelayCommand泛型类型会导致它的canExecute总是解析为false绑定?为了获得正确的行为,我必须使用一个对象,然后将其转换为所需的类型。
注意:canExecute被简化为布尔值,用于测试不起作用的块,通常是属性CanRequestEdit。
不起作用:
public ICommand RequestEditCommand {
get {
return new RelayCommand<bool>(commandParameter => { RaiseEventEditRequested(this, commandParameter); },
commandParameter => { return true; });
}
}
使用:
public ICommand RequestEditCommand {
get {
return new RelayCommand<object>(commandParameter => { RaiseEventEditRequested(this, Convert.ToBoolean(commandParameter)); },
commandParameter => { return CanRequestEdit; });
}
}
XAML:
<MenuItem Header="_Edit..." Command="{Binding RequestEditCommand}" CommandParameter="true"/>
答案 0 :(得分:2)
查看the code for RelayCommand<T>
,特别是我用&#34标记的行; !!!&#34;:
public bool CanExecute(object parameter)
{
if (_canExecute == null)
{
return true;
}
if (_canExecute.IsStatic || _canExecute.IsAlive)
{
if (parameter == null
#if NETFX_CORE
&& typeof(T).GetTypeInfo().IsValueType)
#else
&& typeof(T).IsValueType)
#endif
{
return _canExecute.Execute(default(T));
}
// !!!
if (parameter == null || parameter is T)
{
return (_canExecute.Execute((T)parameter));
}
}
return false;
}
您传递给命令的参数是字符串&#34; true&#34;而不是布尔 true
,因此条件将为失败,因为parameter
不是null
且is
子句为false。换句话说,如果参数的值与命令的类型T
不匹配,则返回false
。
如果你真的想在你的XAML中硬编码一个布尔值(即你的样本不是虚拟代码),那么请查看this question的方法。