WPF复选框勾选IsChecked

34

我不是在谈论这个的事件处理程序,而是一个简单的If语句检查CheckBox是否被选中。到目前为止我有:

if (chkRevLoop.IsChecked == true){}

但是这会引发错误:

无法隐式将类型“bool?”转换为“bool”。存在显式转换(是否缺少强制转换?)

我是否忽略了某种方法来解决这个问题?


1
也许有些东西我没注意到,但你的代码对我来说是有效的。 - vesan
1
大多数答案都可以,但要确切地说,您需要指定当复选框处于不确定状态(其“IsChecked”值为“null”)时应该发生什么。它是否应该通过您的条件? - Jcl
@evanb 这不是布尔类型,而是可空布尔类型。如果你使用 "==" 进行比较,它应该可以工作。 - The incredible Jan
8个回答

50
你可以使用 空值合并运算符。该运算符在左侧运算数为 null 时返回右侧运算数。因此,当 CheckBox 处于 不确定 状态(即 IsChecked 属性的值设置为 null 时),可以返回 false
if (chkRevLoop.IsChecked ?? false)
{

}

13
你必须将 bool? 转换为 bool 才能使其正常工作。
if((bool)(chkRevLoop.IsChecked)){}

由于它已经是一个bool条件,所以不需要放置true false,因为如果它是true,那么它只会进入这个if条件,否则不会。

因此,在这里甚至不需要放置chkRevLoop.IsChecked == true,默认情况下您正在通过放置IsChecked来询问==true


"转换"? 我只看到了一个强制类型转换。 - The incredible Jan

10
已经有多个答案了,但这里还有另一个选择。
if (chkRevLoop.IsChecked.GetValueOrDefault()) {}

From MSDN


4

一个 bool? 可以是 true、false 或 null,而 bool 只能是 true 或 false。 ? 使类型“可空”,并在通常不允许时添加了 null 作为可能性,因此您可以直接使用。

if ((bool)chkRevLoop.IsChecked == true){}

或者

if (chkRevLoop.IsChecked == (bool?)true){}

让它匹配并正常工作。第二种方式可能更好,因为我不知道如果IsChecked为空会发生什么情况。


2
如果 IsChecked 为 null,你的第一个示例将抛出 InvalidOperationException 异常。 - vesan
感觉会很糟糕。总的来说,==没有重载可空不匹配似乎很奇怪。默认为可空转换或@user2946329的答案似乎足够简单。 - MichaelN
1
我认为这也应该可以工作。事实上,OP的代码对我来说运行良好。我仍然不确定这里发生了什么... - vesan
1
你可能正在运行这个程序在一个 WinForms 应用程序上(其中 CheckBox.Checked 是 bool,而不是 bool?,而 OP 明确指出了 WPF)。只是一个想法。 - nurchi
问题在于显式转换。你不能将 null 转换为 bool。如果不进行转换,它就可以工作。将 null 与 true/false 进行比较没有问题。 - The incredible Jan

4

请考虑检查属性是否具有值:

var isChecked = chkRevLoop.IsChecked.HasValue ? chkRevLoop.IsChecked : false;

if (isChecked){}

你不需要写 == true,直接写 if (isChecked) 就可以了。 - On The Net Again

3

只需要一行代码就可以检查单选按钮是否被选中:

string status = Convert.ToBoolean(RadioButton.IsChecked) ? "Checked" : "Not Checked";

给那些投反对票的人,请解释一下为什么,这样我就可以改进我的回答了。 - H Aßdøµ
1
我点赞了,因为你使用Convert回答了这个问题。这个问题不是关于bool或string的结果类型。对我来说,你的答案看起来很完美,这是一种解决方法。 - Nasenbaer

3
复选框的IsChecked属性是可空布尔值。
public bool? IsChecked { get; set; }

创建一个可空的布尔值并赋值给它,这样就可以为您工作了。

代码

bool? NullableBool = chkRevLoop.IsChecked;
if(NullableBool == true)    {    }

没有太多意义。 - The incredible Jan
@TheincredibleJan,请解释一下哪里不太明白了? - Abin

1
你应该使用可空对象。因为 IsChecked 属性可以被赋予三个不同的值:Null、true 和 false。
Nullable<bool> isChecked  = new Nullable<bool>(); 
isChecked = chkRevLoop.IsChecked; 

if (isChecked.HasValue && isChecked.Value)
{


}

如果(isChecked.HasValue)并不意味着它将是“true”。具有“false”值也可以通过您的条件。 - Jcl
2
这可以很容易地重写为 if(chkRevLoop.IsChecked ?? false) { },更加简洁,不需要所有的样板代码 :-) - Jcl
为我们所有人提供明确的解决方案 :) - Ugur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接