【问题标题】:RelayCommand<bool> throws invalid cast exceptionRelayCommand<bool> 抛出无效的强制转换异常
【发布时间】:2015-04-07 17:00:29
【问题描述】:

我正在尝试参数化 RelayCommand,但遇到运行时强制转换异常。

以下是相关的 xaml 和视图模型行:

XAML

<MenuItem Header="Save Project As" Command="{Binding Main.SaveProjectAsRelayCommand}" CommandParameter="false" />

视图模型

public RelayCommand<bool> SaveProjectAsRelayCommand { get; set; }

SaveProjectAsRelayCommand = new RelayCommand<bool>(SaveProjectAs, ProjectTaskCanExecute);

private void SaveProjectAs(bool b){...}
private bool ProjectTaskCanExecute(bool b){...}

当我点击文件菜单时,GalaSoft 会抛出一个

InvalidCastException(“指定的强制转换无效)

当我从所有内容中删除参数时,工作正常。

我是否必须做一些事情才能将“false”转换为布尔值?

【问题讨论】:

    标签: c# wpf mvvm-light relaycommand


    【解决方案1】:

    类型转换器必须将其转换为字符串而不是布尔值。

    <MenuItem Header="Save Project As" Command="{Binding Main.SaveProjectAsRelayCommand}" >
     <MenuItem.CommandParameter>
          <x:Boolean>False<x:Boolean>
     </MenuItem.CommandParameter>
    </MenuItem>
    

    试试上面的。您必须在 XAML 中使用以下名称空间。

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

    【讨论】:

    • 感谢阿迪尔的快速回复。完美运行。
    【解决方案2】:

    或者,您可以在绑定到的“主”中创建一个属性

    <MenuItem Header="Save Project As" Command="{Binding Main.SaveProjectAsRelayCommand}" CommandParameter="{Binding Main.IsTask}" />
    

    在主虚拟机中你将拥有

    public bool IsTask{get;set;}
    

    【讨论】:

    • 感谢您添加。由于只有两个 UI 命令会受到此状态的影响(bool = "includeExtras"),并且视图模型中的两个处理程序最终都会调用业务模型中的相同方法(采用相同的参数),所以我喜欢它从一开始就作为调用参数处理。
    猜你喜欢
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    相关资源
    最近更新 更多