本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议 》和 《 阿里云开发者社区知识产权保护指引 》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单 进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

一、问题场景

某些场景下,需要通过 VM 中的与 CheckBox IsChecked 进行数据 Binding ,代码内容如下:

Xaml 代码

<TabItem Header="测试">
    <TabItem.Resources>
        <local:ViewModel x:Key="ViewModel"></local:ViewModel>
    </TabItem.Resources>
    <CheckBox Content="测试" DataContext="{StaticResource ViewModel}" Command="{Binding CheckCmd}" 
              CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self},Path=IsChecked}"></CheckBox>
</TabItem>

ViewModel 代码

public class ViewModel : INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName] string name = "")
        if (string.IsNullOrEmpty(name))
            return;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    private bool isChecked;
    public bool IsChecked
        get { return isChecked; }
            isChecked = value;
            OnPropertyChanged();
    private ICommand checkCmd;
    /// <summary>
    /// 选中指令
    /// </summary>
    public ICommand CheckCmd => checkCmd ??= new DelegateCommand<bool>(CheckStatus);
    private void CheckStatus(bool ischecked)
}

运行效果异常结果:

image

二、解决方案

由于 CheckBox Command 绑定了 CheckCmd 命令,参数传递当前 IsChecked 控件属性,需要注意的是, IsChecked 类型为 bool? 类型,源码如下:

运行时,触发执行 Command ,转换过程中,无法将 CommandParameter 对应的参数由 null 转换为 bool 类型,故而报错。

解决方案是,将 ViewModel 中命令 CheckCmd 中对应的执行函数类型 bool 转换为 bool? ViewModel 变更如下:

再次运行,则不再报错。


WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参
原文:WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参 ContextMenu无论定义在.cs或.xaml文件中,都不继承父级的DataContext,所以如果要绑定父级的DataContext,直接DataContext=“{Bind...