一、问题场景
某些场景下,需要通过 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; }
set
{
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?
类型,源码如下:
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)
{
}
再次运行,则不再报错。