使复选框绑定为可空布尔过渡从null到真

问题描述:

我有一个复选框,它的IsChecked属性绑定到一个可为空的布尔值。当我的控件第一次加载时,该值为空,复选框显示为灰色。这就是我要的。使复选框绑定为可空布尔过渡从null到真

当用户单击复选框时,它将转到false/Unchecked状态。

但是,99%的时间用户要勾选复选框 - 目前意味着双击该复选框。

当用户第一次点击复选框时,如何使值从空移动到真?

您可以修改绑定属性的setter以检查前一个值是否为空,如果是,则将该值设置为true。事情是这样的:

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

结合系统将重新读取属性它集之后,因此新值将由CheckBox反映。

+1

这将影响试图设置属性的代码,这相当不妥。 – Miral 2012-09-18 01:14:16

最简单的方法是简单地处理click事件,并设置控制true如果当前状态为null,可选的第一次点击后您的内部代码的跟踪设定一个flag

您可以处理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; 

} 

我有同样的问题,跑进这个问题。这是一个迟到的反应,但我认为这是最好的解决办法:)

随着IsThreeStateTargetNullValue帮助下,你可以做到这一点

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

唯一需要注意的是,它会零和真实之间切换。永远不会有错误的价值。