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

17 篇文章 0 订阅
13 篇文章 6 订阅

一、问题场景

某些场景下,需要通过 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)
{
    
}

再次运行,则不再报错。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值