gpt4 book ai didi

wpf - MVVM Light canExecute 始终为 false,RelayCommand 而不是 RelayCommand
转载 作者:行者123 更新时间:2023-12-04 14:37:44 24 4
gpt4 key购买 nike

有谁知道为什么特定于 MVVM Light RelayCommand 通用类型会导致其 canExecute 始终解析为 false 以进行绑定(bind)?为了获得正确的行为,我必须使用一个对象,然后将其转换为所需的类型。

注意:canExecute 已简化为 bool 值,用于测试不起作用的 block ,通常是属性 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"/>

最佳答案

the code for RelayCommand<T> ,特别是我用“!!!”标记的行:

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;
}

您传递给命令的参数是字符串“true”,而不是 bool 值 true ,所以条件会失败,因为 parameter不是 nullis条款是错误的。换句话说,如果参数的值与类型不匹配 T命令,然后返回 false .

如果您真的想将 bool 值硬编码到您的 XAML 中(即您的示例不是伪代码),请查看 this question了解如何做到这一点。

关于wpf - MVVM Light canExecute 始终为 false,RelayCommand<bool> 而不是 RelayCommand<object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36134130/

24 4 0