WPF-Binding问题-MVVM中IsChecked属性CommandParameter转换值类型空异常

本文档描述了在WPF应用中,使用MVVM模式时,CheckBox的IsChecked属性与ViewModel绑定出现问题的场景。问题在于CheckBox的IsChecked属性为bool?类型,而ViewModel中的命令参数为bool类型,导致运行时转换异常。解决方案是将ViewModel中的CheckCmd命令参数类型修改为bool?,使得类型匹配,从而避免运行时错误。更新ViewModel后,程序能够正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题场景

某些场景下,需要通过 VM 中的与 CheckBoxIsChecked 进行数据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; }
        set
        {
            isChecked = value;
            OnPropertyChanged();
        }
    }

    private ICommand checkCmd;
    /// <summary>
    /// 选中指令
    /// </summary>
    public ICommand CheckCmd => checkCmd ??= new DelegateCommand<bool>(CheckStatus);

    private void CheckStatus(bool ischecked)
    {
        
    }
}

运行效果异常结果:

WPF-VM-BindingNull

二、解决方案

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

public class ToggleButton : ButtonBase
{
    [Category("Appearance")]
    [TypeConverter(typeof(NullableBoolConverter))]
    [Localizability(LocalizationCategory.None, Readability = Readability.Unreadable)]
    public bool? IsChecked
    {
        get { }
        set { }
    }
}

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

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

private ICommand checkCmd;
/// <summary>
/// 选中指令
/// </summary>
public ICommand CheckCmd => checkCmd ??= new DelegateCommand<bool?>(CheckStatus);

private void CheckStatus(bool? ischecked)
{
    
}

再次运行,则不再报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值