将复选框绑定到可以为空的bool从null转换为true

时间:2011-03-15 15:29:03

标签: wpf binding checkbox

我有一个复选框,其IsChecked属性绑定到可以为空的bool。当我的控件首次加载时,该值为null,复选框显示为灰色。这就是我想要的。

当用户单击该复选框时,它将移至false / Unchecked状态。

然而,99%的用户想要勾选复选框 - 这当前意味着双击复选框。

当用户第一次单击复选框时,如何使值从null移动到true?

5 个答案:

答案 0 :(得分:6)

您可以修改bound属性的setter来检查前一个值是否为null,如果是,则将值设置为true。像这样:

public bool? MyBoolProperty 
{
   get { return _myBoolProperty; }
   set 
   {
       _myBoolProperty = (_myBoolProperty != null || value == null) ? value : true;
       RaisePropertyChanged("MyBoolProperty");       
   }
}

绑定系统会在设置后重新读取属性,因此新值将由CheckBox反映出来。

答案 1 :(得分:6)

我遇到了同样的问题并遇到了这个问题。这是一个迟到的回应,但我认为这是最好的解决方案:)

IsThreeStateTargetNullValue的帮助下,您可以完成此操作

 <CheckBox  IsThreeState="False" IsChecked="{Binding YOUR_NULLABLE_PROPERTY, TargetNullValue=false}" />

唯一需要注意的是,它将在null和true之间切换。永远不会有错误的价值。

答案 2 :(得分:3)

您可以处理Click事件并实现如下逻辑:

private void CheckBox_Click(object sender, RoutedEventArgs e)
{
  CheckBox cb = sender as CheckBox;

  switch (cb.IsChecked) 
  {
    case null:
      cb.IsChecked = false;
      break;

    case true:
      cb.IsChecked = true;
      break;

    case false:
      if (cb.IsThreeState) {
        cb.IsChecked = null;
      } else {
        cb.IsChecked = true;
      }
      break;
  }

  e.Handled = true;

}

答案 3 :(得分:1)

我最近遇到过这个问题。我看了这个问题的所有答案,但似乎没有人适合我。在ViewModel中将IsChecked等于false时,接受的答案失败。我反编译了wpf中的复选框。 如您所见,当您单击空IsChecked复选框时,IsChecked属性将切换为false。

protected internal virtual void OnToggle()
{
    bool? flag;
    if (this.IsChecked == true)
    {
        flag = (this.IsThreeState ? null : new bool?(false));
    }
    else
    {
        flag = new bool?(this.IsChecked.HasValue);
    }
    base.SetCurrentValueInternal(ToggleButton.IsCheckedProperty, flag);
}

所以你可以创建一个新类继承CheckBox并覆盖OnToggle方法,如下所示:

protected override void OnToggle()
{
   bool? flag;
   if (this.IsChecked == true)
   {
       flag = this.IsThreeState ? null : new bool?(false);
   }
   else 
       flag = true;
   // what a pity this method is internal
   // actually you can call this method by reflection
   base.SetCurrentValueInternal(ToggleButton.IsCheckedProperty, flag);
}

另一种方式是:

protected override void OnToggle()
{
    if (this.IsChecked == null)
        this.IsChecked = false;
    base.OnToggle();
}

答案 4 :(得分:0)

最简单的方法是简单处理click事件并将控件设置为true,如果其当前状态为null,则可选择为您的内部设置flag首次点击后进行代码跟踪。