相关文章推荐
微笑的闹钟  ·  java.lang.AssertionErr ...·  5 月前    · 
沉着的汉堡包  ·  Error: Projects must ...·  11 月前    · 
豪气的创口贴  ·  找不到opencv dll - ...·  1 年前    · 

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)

运行效果异常结果:

二、解决方案

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

再次运行,则不再报错。

如果控件有选择事件的话这一在XAML直接IsChecked=true可能出问题 因为程序编译先执行初始化控件后执行窗体load等事件,所以在XAML直接IsChecked=true便会在控件加载便执行选择事件,再执行窗体事件和全局变量,很可能会报错,这时不要在XAML直接IsChecked=true,而要在窗体load事件手动写一下代码 最近的一个项目是用MVVM实现,在实现功能的时候,就会有一些东西,和以前有很大的区别,项目就用到了常用的序号,就是在Datagrid里的一个字段,用checkbox来实现。 既然是MVVM,就要用到ModleView,View和Model三层。 先看一下效果 当然,也可以确定是哪一项被选了,这个代码里有。 实现这个全选功能,用到了三个DLL文件,分别为GalaSoft.MvvmLi... 先看看效果: 完全采用MVVM的各种绑定。点击表头CheckBox可实现全选和取消全选,选数据行所有CheckBox时自动选表头CheckBox,数据行有未选的则不会选表头CheckBox。 demo下载:百度网盘(链接:https://pan.baidu.com/s/1vKmPFMbY6WSN6d0-kvu83w 密码:vk4h)... <DataGrid Name="DG1" Grid.Row="5" Grid.ColumnSpan="4" ItemsSource="{Binding MyList,Mode=TwoWay}" AutoGenerateColumns="False" > <DataGrid.Columns> <DataGridTextColumn Width="550" H... <Window x:Class="checkboxtest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" /// Value converter between bool and IsChecked property value (bool?) [ValueConversion(typeof(bool), typeof(bool?))] public class IsCheckedConverter : IValueConverter 《前言》首先,简单介绍一下,什么是数据绑定?一种用声明的方式将控件和数据绑定在一起的方式。简单来理解一下就是:控件的属性由你绑定的数据来动态判断的方式。《核心前提部分》一个绑定(Binding)关系由四个组件构成:    1) 绑定目标    2) 目标属性    3) 源目标    4) 源属性简言之:    绑定目标就是控件    目标属性就是控件对应的属性    源目标就是数据对象(类对象)...