我有一个复选框,其IsChecked
属性绑定到可以为空的bool。当我的控件首次加载时,该值为null,复选框显示为灰色。这就是我想要的。
当用户单击该复选框时,它将移至false / Unchecked状态。
然而,99%的用户想要勾选复选框 - 这当前意味着双击复选框。
当用户第一次单击复选框时,如何使值从null移动到true?
答案 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)
我遇到了同样的问题并遇到了这个问题。这是一个迟到的回应,但我认为这是最好的解决方案:)
在IsThreeState
和TargetNullValue
的帮助下,您可以完成此操作
<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
首次点击后进行代码跟踪。