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

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

一、问题场景

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

运行效果异常结果:

二、解决方案

由于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)
{
}

再次运行,则不再报错。


相关文章
|
8月前
|
设计模式 开发框架 前端开发
深入理解WPF中MVVM的设计思想
近些年来,随着WPF在生产,制造,工业控制等领域应用越来越广发,很多企业对WPF开发的需求也逐渐增多,使得很多人看到潜在机会,不断从Web,WinForm开发转向了WPF开发,但是WPF开发也有很多新的概念及设计思想,如:数据驱动,数据绑定,依赖属性,命令,控件模板,数据模板,MVVM等,与传统WinForm,ASP.NET WebForm开发,有很大的差异,今天就以一个简单的小例子,简述WPF开发中MVVM设计思想及应用。
61 0
|
10月前
|
前端开发 算法 JavaScript
走进WPF之MVVM完整案例
走进WPF之MVVM完整案例
154 0
|
前端开发 C# 图形学
【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入
前言:在C/S架构上,WPF无疑已经是“桌面一霸”了。在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用。但是WPF也有很多年的历史了,并且基于MVVM的开发模式,受到了很多开发者的喜爱。
563 0
【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入
|
前端开发 C# 数据库
WPF MVVM系统入门-下
本文详细讲解WPF,MVVM开发,实现UI与逻辑的解耦。
|
前端开发 数据可视化 C#
WPF MVVM系统入门-上
本文详细讲解WPF,MVVM开发,实现UI与逻辑的解耦。
|
前端开发 C#
WPF MVVM 如何在 ViewModel 中关闭界面窗口
WPF MVVM 如何在 ViewModel 中关闭界面窗口
|
前端开发 C#
WPF 之 数据与命令绑定 (MVVM方式)
WPF 之 数据与命令绑定 (MVVM方式)
160 0
WPF 之 数据与命令绑定 (MVVM方式)
|
SQL 前端开发 C#
WPF MVVM模式
WPF MVVM模式