本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《
一、问题场景
某些场景下,需要通过
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)
}
运行效果异常结果:
由于
CheckBox
的
Command
绑定了
CheckCmd
命令,参数传递当前
IsChecked
控件属性,需要注意的是,
IsChecked
类型为
bool?
类型,源码如下:
运行时,触发执行
Command
,转换过程中,无法将
CommandParameter
对应的参数由
null
转换为
bool
类型,故而报错。
解决方案是,将
ViewModel
中命令
CheckCmd
中对应的执行函数类型
bool
转换为
bool?
,
ViewModel
变更如下:
再次运行,则不再报错。