MVVM Light 可以执行总是假的中继命令<bool>而不是中继命令<object>



>有谁知道为什么特定于 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"/>

查看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",而不是布尔true ,因此条件将失败,因为 parameternullis 子句为 false。 换句话说,如果参数的值与命令的类型T不匹配,则返回 false

如果你确实想将布尔值硬编码到 XAML 中(即你的示例不是虚拟代码),请查看此问题以找到执行此操作的方法。

相关内容

  • 没有找到相关文章

最新更新